Mysql SQL的Replace()如何匹配?
MySQL匹配的Mysql SQL的Replace()如何匹配?,mysql,Mysql,MySQL匹配的必须在replace语句中回退到52个不同的值。我不明白这怎么可能。那么,MySQL是如何匹配对象的呢 我做了一次从英国到英国的替换,并打印了不同的国家。它起到了作用,但我注意到一个错误,那就是作为一个国家,必须支持财政部。我用NULL替换了它,结果MySQL用NULL替换了所有国家/地区的值 | 19 | 15:22:27 | UPDATE Trade SET country = REPLACE(country, "UK", "United Kingdom") | 360 ro
必须在replace语句中回退到52个不同的值。我不明白这怎么可能。那么,MySQL是如何匹配对象的呢
我做了一次从英国到英国的替换,并打印了不同的国家。它起到了作用,但我注意到一个错误,那就是作为一个国家,必须支持财政部。我用NULL
替换了它,结果MySQL用NULL
替换了所有国家/地区的值
| 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 |
编辑:
好的,在玩过之后,我可以确认,无论何时尝试替换(Field,item,NULL)
,它都会完全忽略搜索和匹配,而会在字段中的每个值上删除NULL
因此,问题仍然是,有人知道为什么会发生这种情况吗?因为REPLACE()
将输入字符串与值匹配。它检查输入字符串是否是字段值的子字符串,如果是,则用您的值替换它。因此,当您尝试将UK
替换为UK
时,它会在您的数据中搜索所有出现的UK
,并将其全部替换
使用WHERE
指定故障记录并进行更换,而不是进行更换
UPDATE Trade SET country=NULL,其中country=“Must backout Treasury”
或
updatetradesetcountry=NULL,其中像“%Must backout Treasury%”这样的国家在MySQL中,大多数涉及NULL
值的字符串操作的计算结果都是NULL
。这种行为在思考NULL
表示“我不知道这有什么价值”的想法时是有意义的
考虑:
SELECT CONCAT('abc',NULL)
返回NULL
。如果我在“abc”后面加上一个“unknown”值,结果将是“unknown”。同样地
SELECT REPLACE('abc','d',NULL)
将“未知”值放入字符串将导致“未知”值。所以这个表达式返回NULL
。无论'd'
是否出现在'abc'
中
通常,在将表达式合并到UPDATE
语句之前,我们先测试SELECT
语句中的表达式。这允许我们确认要匹配的行以及表达式的结果,例如
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 ...
因为你没有WHERE子句。记住,REPLACE只是一个字符串操作函数,而不是一个搜索标准。我的建议是,您实际上有9773行,其中有“必须回退”
在国家/地区
列中要在更新前写一个检查,请始终运行从y中选择x,其中col\u in_question='坏数据'
检查应更新多少行,并检查您的条件是否正确您的查询将修改国家/地区
列中包含必须退出国库“
的任何行。它将搜索表23027中的所有行,但只更新找到“必须收回资金”的行。
9773我想它完全按照您的要求做了。它只搜索了国家字段否?但是的,它正确地找到了英国,并用英国取代了英国。我感到困惑的是,它似乎在每个国家/地区字段中都发现了“必须退出国库”,这是不可能的,因为“联合王国”现在至少是52个不同值中的1个。不同值将显示输出中的一行,即使有100000行包含单个值!!!!是,它只搜索了国家
字段。正如@riggsfully所提到的,DISTINCT
只显示一个值,这让您错误地认为,当存在多个时,只有一个必须回退的资金记录。因此,它取代了国家/地区
字段中出现的每一个值,我知道这是不同的,也许你过度关注的是,还有51个不同的值,而MySQL匹配了所有这些值的“必须退出国库”。如果有任何一个条目将其作为子字符串,这是可能的,但我们都知道“联合王国”是1,我知道还有50个国家没有将其作为子字符串……这不是一个国家,所以当您运行UPDATE Trade SET country=REPLACE(country,“Must backout Treasury”,NULL)
然后运行DISTINCT
调用时,上面写着1吗<代码>|9773行受影响的行匹配:23027更改:9773警告:0 |这只是说它更改了很多行。您的表有9773条记录吗?好的,但是后端不应该被写入,所以如果“d”不在其中,那么就中断吗?比如,当它找不到“d”的位置开始时,为什么要尝试输入NULL?这是计算中的一个快捷方式,很可能是在优化时而不是运行时完成的。MySQL计算表达式REPLACE(x,y,NULL)
,得到的快捷方式值为NULL。这就好像我们刚刚编写了NULL
。同样的事情也发生在CONCAT(x,NULL)上。唯一不会出现这种快捷方式的情况是,我们使用了一个不知道所有行都为NULL的表达式<代码>CONCAT(t.x,t,y),,,在我们查看每一行之前,我们不知道x和y的值。啊,好吧!谢谢你们两位。我在争论我的理智。使用NULL
值会让任何人质疑它们的理智!