SQL的Replace()如何匹配?

时间:2019-03-13 20:10:11

标签: mysql

MySQL在replace语句中将Must backout Treasury匹配到52个不同的值。我不知道这怎么可能。那么,MySQL如何匹配对象?

我从英国替换为英国,并打印了不同的国家。它有效,但是我发现Must backout Treasury作为一个国家存在错误。我去用NULL替换了它,只是让MySQL用NULL替换了所有Country值。

| 19 | 15:22:27 | UPDATE Trade SET country = REPLACE(country, "UK", "United Kingdom")
| 360 row(s) affected Rows matched: 23027  Changed: 360  Warnings: 0   

我把东西放回去

| 20 | 15:22:39 | SET SQL_SAFE_UPDATES = 1 

看看有什么变化;注意52个值

| 21 | 15:22:51 | SELECT DISTINCT(Country) FROM Trade
| 52 row(s) returned  

并尝试替换这1个坏值

| 22 | 15:23:48 | SET SQL_SAFE_UPDATES = 0  
| 23 | 15:23:48 | UPDATE Trade SET country = REPLACE(country, "Must backout Treasury", NULL)
| 9773 row(s) affected Rows matched: 23027  Changed: 9773  Warnings: 0 |

编辑: 好的,经过测试后,我可以确认您每次尝试REPLACE(Field, item, NULL)时都会完全无视搜索和匹配,而是将NULL放在字段中的每个值上。

所以,问题仍然存在,有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

因为REPLACE()将输入字符串与值匹配。它检查输入字符串是否是字段值的子字符串,如果是,则将其替换为您的值。因此,当您尝试将UK替换为United Kingdom时,它将搜索数据中所有出现的UK并将其全部替换。

使用WHERE来指定故障记录并进行替换,而不是替换。

UPDATE Trade SET country=NULL WHERE country="Must backout Treasury" UPDATE Trade SET country=NULL WHERE country LIKE "%Must backout Treasury%"

答案 1 :(得分:0)

在MySQL中,大多数涉及NULL值的字符串操作最终将评估为NULL。考虑到NULL代表“我不知道它的价值”这一想法,这种行为是有意义的。

考虑:

 SELECT CONCAT('abc',NULL)

返回NULL。如果我将“未知”值附加到“ abc”,则结果将是“未知”。同样,

 SELECT REPLACE('abc','d',NULL)

将“未知”值放入字符串中将导致“未知”值。因此,此表达式返回NULL'd'是否出现在'abc'中都没关系。


通常,在将表达式合并到SELECT语句中之前,我们先在UPDATE语句中测试表达式。这样我们可以确认要匹配的行以及表达式的结果,例如

 SELECT t.country 
      , REPLACE(t.country, 'Must backout Treasury', NULL) AS country_repl_null
      , REPLACE(t.country, 'Must backout Treasury', '')   AS country_repl_empty
   FROM trade t
  ORDER 
     BY ...