删除MySQL

时间:2016-06-25 08:04:46

标签: mysql

我的一个字段包含一段奇怪的文字,但其中有一些对我很重要的内容:
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

3 个答案:

答案 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

在运行上述查询之前:

SQL FIDDLE DEMO

运行上述查询后

SQL FIDDLE

答案 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
  )