在数据库导入之后,有一些带有脏字段的行以数据库中保存的(有时多个)空格结束,并且为了在成千上万的其他行中找到它们,我可以使用它们。我试图做一个像这样的查询:
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP ' $'
但是返回零行。我尝试了其他一些结果与其他结果:
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[:space:]]$' -- Zero Rows
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]$' -- Zero Rows
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]' -- Those with a space anywhere in the value
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]{2}' -- Those with two spaces in a row
使用单个空格查找所有内容并没有多大帮助,因为一些干净的行在该字段中的单词之间有单个空格。最后一个捕获了90%的脏行,但是错过了那些只有一个空格的行。我如何使用$
符号表示字段的结尾有什么问题吗?
在计算字段结尾时,MySQL RIGHT()
和SUBSTRING()
函数似乎剥离了空格:
SELECT * FROM `mytable` WHERE RIGHT(`dirtyfield`)=" " -- Only returns one row that has " " for that field
SELECT * FROM `mytable` WHERE SUBSTR(`dirtyfield`,-1)=" " -- Only returns one row that has " " for that field
使用比较的另一个尝试也没有:
SELECT * FROM `mytable` WHERE TRIM(`dirtyfield`)!=`dirtyfield` -- zero rows returned
" dirtyfield"如果重要,则字段为VARCHAR(128)
。
编辑:我是个白痴;字段不以空格结尾,然后以多个空格结尾,后跟逗号(从错误的CSV文件导入)。
SELECT * FROM `mytable` WHERE RIGHT(`dirtyfield`,1)=','
该查询找到了它们。我用逗号分隔的视图查看表的输出,并没有注意到逗号是双倍的。
答案 0 :(得分:6)
我认为这可能是正确的:
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]+$'
它将字段结尾($)与1个或多个(+)空格([[.space。]]匹配) 无论如何,如果你想用LIKE语句做同样的事情更容易:
... LIKE '% '
如下面的答案。
答案 1 :(得分:4)
有类似的问题。你用trim()做的比较:
SELECT * FROM `mytable` WHERE TRIM(`dirtyfield`)!=`dirtyfield`
不起作用,但是:
SELECT * FROM mytable where char_length(dirtyfield) > char_length(trim(dirtyfield))
完成工作并向您显示在内容的开头和/或结尾都有空格的行。字符计数有效。老实说,我不知道为什么trim()不会直接在第一个查询上进行比较。
希望这会有所帮助。就像你的领域一样,这个解决方案肯定有点脏。
答案 2 :(得分:1)
我没有尝试过这个,但我认为这可能会找到以空格结尾的条目
SELECT * FROM `mytable` WHERE `dirtyfield` LIKE "% "
答案 3 :(得分:0)
您是否认为您实际上获得了包含空格的行,但是Web浏览器不会为您呈现这些行?
“两个(2个或更多个空格)单词”的值在您的浏览器中看起来像“两个单词”。
尝试:
WHERE dirtyfield REGEXP '(^[[:space:]]|[[:space:]]{2,}|[[:space:]]$)'
这应该获取所有这些行。只要考虑一下你可能会获得正确的行,但由于浏览器的原因,它看起来并不那样。
答案 4 :(得分:0)
嘿,我做了类似的事情并进入了这个页面,查看下面的查询,这可能会有所帮助..
SELECT * FROM `mytable` WHERE `dirtyfield` LIKE "% %"