- 极权主义的政党懂得,允许任何非政治的“孤岛”就等于提供了滋生异端或政治冷漠的土壤。
- 我们国家社会主义者以十分的自信宣称,对我们来说,在攸关人民的国家与社会利益之所有政治和其他事务上,元首绝对正确。--赫曼·戈林(1941)
- 米兰·昆德拉(milan kundra)写道:“极权主义不仅是人间地狱,还是天堂之梦。”没有这个梦,国家社会主义和马列主义就不能在人类灵魂中建立它们已然拥有的控制。对他们的追随者来说,这一梦想使他们能悬着忽略罪恶,看见善的幻想。
- 一个人必须倾听人们在说什么,如果他想争取他们的话。
Thursday, November 14, 2019
《弯曲的脊梁》摘录
Monday, November 4, 2019
MariaDB与ORACLE数据库的字符串分割
最近关于ORACLE向MariaDB迁移涉及到区别比较多~~~
放到ORACLE中执行一下:
效果似乎不错。
但在MariaDB中要怎么操作呢?
事实上,在10.0.38版本是不支持with as 语法的,但是也还好,with as 实际上就是个子查询,放到查询里面就是了。
但REGEXP_SUBSTR()怎么解决呢?
先来看下ORACLE中的REGEXP_SUBSTR()函数。
根据文档说明,REGEXP_SUBSTR的语法是这样婶的:
是不是清晰了很多?其实就是生成了一个序列。那看回上述例子,我们就明白了它取了SYSNO_ARRAY的下标,嗯,大概就是这个意思,然后交给REGEXP_SUBSTR()这样就可以取出每一个匹配的字符串了。
MariaDB也有个类似的REGEXP_SUBSTR()内建函数,但根据MariaDB的官方文档:
该函数不能做到像ORACLE里的REGEXP_SUBSTR()那样可以选择起始位置或选择哪一个匹配的结果,功能比较单一.
还是直接上栗子吧。
还是以前的student表:
假如从前台传入一个由sno组成的字符串,比如“1,11,15,16”。
要根据该字符串查出这几条数据。
在ORACLE中可以这样写:
WITH SYSNO AS (SELECT ? SNO FROM DUAL),
SYSNO_ARRAY AS (
SELECT REGEXP_SUBSTR(SNO,'[^,]+',1,LEVEL) SNO FROM SYSNO CONNECT BY LEVEL<=LENGTH(SNO)-LENGTH(REPLACE(SNO,',',''))+1
)
SELECT * FROM STUDENT T WHERE T.SNO IN (SELECT SNO FROM SYSNO_ARRAY)
大概就是是这样一个情景。放到ORACLE中执行一下:
效果似乎不错。
但在MariaDB中要怎么操作呢?
事实上,在10.0.38版本是不支持with as 语法的,但是也还好,with as 实际上就是个子查询,放到查询里面就是了。
- ORACLE REGEXP_SUBSTR()
但REGEXP_SUBSTR()怎么解决呢?先来看下ORACLE中的REGEXP_SUBSTR()函数。
根据文档说明,REGEXP_SUBSTR的语法是这样婶的:
REGEXP_SUBSTR(source_char, pattern [, position [, occurrence [, match_parameter ]]])
各参数的意义分别是:
现在,参照官方文档我们看一下上述ORACLE里的sql,我们传入一个值为‘1,11,15,16’的source_string,从第一个字符开始根据正则表达式'[^,]+'按逗号‘,’分割它,并取其第...LEVEL 个匹配项???
这个LEVEL 又是个什么东西啊?
LEVEL是ORACLE的关键字,主要用来代表树形结构中的层级编号,它与后面的CONNECT BY组合可以存在树形结构的数据,关于这部分的知识比较复杂,我也不是很明白,以后遇到可以单独再出一片学习文档。在这里,我们可以看一个简单的例子就能明白这样写的作用:
- MariaDB REGEXP_SUBSTR()
MariaDB也有个类似的REGEXP_SUBSTR()内建函数,但根据MariaDB的官方文档:
该函数不能做到像ORACLE里的REGEXP_SUBSTR()那样可以选择起始位置或选择哪一个匹配的结果,功能比较单一.
- MariaDB SUBSTRING_INDEX()
好在MariaDB提供了另外一个内建函数SUBSTRING_INDEX().
可以实现类似的根据字符分割字符串并取其中某一匹配项。
另外,在实现过程中还使用到了自带的mysql数据库中的
help_topic表,它的help_topic_id字段是自增的,当然你也可以使用其他具有自增字段的表。
直接看最终的SQL:
SELECT * FROM student WHERE SNO IN (
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(SNO,',',help_topic_id+1),',',-1) AS SNO
FROM
mysql.help_topic,(SELECT '1,11,15,16' SNO)SYSNO_ARRAY
WHERE
help_topic_id < LENGTH(SNO)-LENGTH(REPLACE(SNO,',',''))+1);
分析一下这段sql:- 利用help_topic_id < LENGTH(SNO)-LENGTH(REPLACE(SNO,',',''))+1)可以得到最终可以被拆分为多少个字符串,有三个逗号,那结果就是四个字符串。之后就可以利用help_topic_id来遍历第n个匹配的字符串了。
- SUBSTRING_INDEX(SUBSTRING_INDEX(SNO,',',help_topic_id+1),',',-1) AS SNO。利用内层的SUBSTRING_INDEX() 可以取出第help_topic_id+1(help_topic_id是从0开始)个逗号之前的字符串,也就是说,
- 之后再利用外层的SUBSTRING_INDEX()取根据逗号分割的-1个匹配项,就可以将所有的SNO取出,通过SNO 在student表中取数据了。
help_topic_id = 0,help_topic_id+1=1,SUBSTRING_INDEX(SNO,',',help_topic_id+1) = 1
help_topic_id = 1,help_topic_id+1=2,SUBSTRING_INDEX(SNO,',',help_topic_id+1) = 1,11
最后放到MariaDB中运行一下:
可以,没问题!
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2019/11/mariadb.html
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2019/11/mariadb.html
Friday, November 1, 2019
Table 'name' is specified twice, both as a target for 'UPDATE' and as a separate source for data
明明一个在ORACLE里平平无奇的UPDATE语句放到较旧的MariaDB(10.0.38)里面变得如此的麻烦~
还用上次的表好了,原始数据如下:
现在我想把第一条的course后面加一个’类‘字,我们可能会这样写:
大概就是说你不能自己又当“因”,又当“果”,(额,自己打自己?)
那既然不允许被更新的表直接出现在子查询中,那我们可以把它放到缓存表里,就像这样:
还用上次的表好了,原始数据如下:
现在我想把第一条的course后面加一个’类‘字,我们可能会这样写:
update student t set course = (concat((select course from student t where t.sno=8),'类')) where t.sno=8;当然它在ORALCE中是没有问题的,可是放到MariaDB中运行它,就会返回“Table 't' is specified twice, both as a target for 'UPDATE' and as a separate source for data”的错误提示。
大概就是说你不能自己又当“因”,又当“果”,(额,自己打自己?)
那既然不允许被更新的表直接出现在子查询中,那我们可以把它放到缓存表里,就像这样:
update student t set course = (concat((select * from(select course from student t where t.sno=1)as temp),'类')) where t.sno=1;执行这条语句就可以回避之前的尴尬错误。效果如下:
事实上,在MariaDB的官方文档中对这样的UPDATE情况有说明:
文档说的很明白了,对于这种源和目标是同一张表单情况,截至到10.3.1版本都是不支持的,即需要用我上述的方法“曲线救国”,自10.3.2版本后这样的写法就是可以的了~
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2019/11/table-name-is-specified-twice-both-as.html
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2019/11/table-name-is-specified-twice-both-as.html
Subscribe to:
Posts (Atom)










