我的一个字段包含一段奇怪的文字,但其中有一些对我很重要的内容:
EX:我的领域是这样的:
\“'出路'(如何成为一体)(1961){Side Show(#1.12)} \''s Schaep Met De 5 Pooten \“
所有文字都是垃圾,我只想要1961年 此外,我的表有超过200K行。
年份在括号内。下面显示的查询适用于每个位置,但是当我在一年之前在括号内有某些东西时会出现问题。 所有的文字都是垃圾,但这一年是必需的。我已经用过:
UPDATE `myTable`
SET `myField` = (SUBSTRING_INDEX(`myField`, '(', -3));
UPDATE `myTable`
SET `myField` = (SUBSTRING_INDEX(`myField`, ')', 3));
UPDATE `myTable`
SET `myField` = (SUBSTRING_INDEX(`myField`, ')', 2));
UPDATE `myTable`
SET `myField` = (SUBSTRING_INDEX(`myField`, ')', 1));
有没有办法让查询只保存包含4位数字的任何括号内的值? 在上面的例子中,结果应该是:1961
答案 0 :(得分:2)
你可以尝试一下(我想这是一次性工作因此留下性能问题):
UPDATE myTable MT
CROSS JOIN
(
Select (th*1000+h*100+t*10+u+1) x from
(select 0 th union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) A,
(select 0 h union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) B,
(select 0 t union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) C,
(select 0 u union select 1 union select 2 union select 3 union select 4 union
select 5 union select 6 union select 7 union select 8 union select 9) D
WHERE (th*1000+h*100+t*10+u+1) >= 1800
AND (th*1000+h*100+t*10+u+1) <= 3000
order by x
) t
SET MT.myField = t.x
WHERE `myField` LIKE CONCAT('%',t.x,'%');
注意:假设您的年份字符串在此范围内:from 1800 to 3000
最好将最小和最大年份放在where子句
中 WHERE (th*1000+h*100+t*10+u+1) >= MINIMUM_YEAR
AND (th*1000+h*100+t*10+u+1) <= MAXIMUM_YEAR
在运行上述查询之前:
运行上述查询后
答案 1 :(得分:1)
如果(xxxx)中只有一个4位数值,那么您可以使用 REGEXP_REPLACE ,但我不确定它是否仅在MariaDB中
SELECT
REGEXP_REPLACE(
"Way Out\"(How to be one) (1961) {Side Show (#1.12)}\"'t Schaep Met De 5 Pooten"
, '^(.*) \\(([0-9]{4})\\) (.*)$'
, '\\2'
) AS VAL;
<强>样品强>
MariaDB [yourSchema]> SELECT
-> REGEXP_REPLACE(
-> "Way Out\"(How to be one) (1961) {Side Show (#1.12)}\"'t Schaep Met De 5 Pooten"
-> , '^(.*) \\(([0-9]{4})\\) (.*)$'
-> , '\\2'
-> ) AS VAL;
+------+
| VAL |
+------+
| 1961 |
+------+
1 row in set (0.00 sec)
MariaDB [yourSchema]>
答案 2 :(得分:1)
如果字符串的结构是固定的,你可以搜索右括号)然后是开始括号(第一个:
select substring_index(text, ') (', -1)
然后你可以在第一个开括号之前得到这个子串的一部分:
select
substring_index(
substring_index(text, ') (', -1),
')',
1
)