我的一个字段包含一段奇怪的文本,但其中有些内容对我很重要:
我的领域是这样的:
\“‘出路’”(如何成为一个)(1961年){侧展(1.12)}“'t schaep met
数据元素5 Pooten“
所有的文字都是垃圾,我只想要1961。
而且,我的表有超过20万行。
年份在括号内。下面显示的查询在每个位置都有效,但是当我在一年前在圆括号中找到某个内容时,就会出现问题。
所有的文本都是垃圾,但年份是必需的。我已经用过:

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

最佳答案

你可以试一试(我想这是一次性的工作,因此不考虑性能问题):

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
在运行上述查询之前:
SQL FIDDLE DEMO
运行以上查询后:
SQL FIDDLE

09-26 21:30