正在寻找?和MSSQL中的空格

时间:2015-06-09 13:42:56

标签: sql-server tsql

我有一个varchar列,其中插入了一些nvarchar数据,所以我现在有包含'?'等数据的记录? ???“

select * from table where EnglishName LIKE '%[? ]%'

返回所有内容,LIKE '[? ]'的其他变体不会返回我之后的数据。

如何选择仅包含问号的记录,并可选择包含空格?

'??' - return
'? ?' - return
' ?' - return
'? chen' - don't return
' ' - don't return
'  chen' - don't return

3 个答案:

答案 0 :(得分:4)

使用其他谓词过滤掉非?或空格字符:

WHERE (col LIKE '%[? ]%') AND (col NOT LIKE '%[^? ]%')

以上选择包含 空格的记录。如果您想要过滤掉这些记录,只需使用:

WHERE (col LIKE '%[?]%') AND (col NOT LIKE '%[^? ]%') 

答案 1 :(得分:3)

试试这个:

DECLARE @t TABLE (id INT, n VARCHAR(100))
INSERT INTO @t VALUES
(1, '??'),
(2, '? ?'),
(3, ' ?'),
(4, ' ? '),
(5, '? '),
(6, ' ? ? '),
(7, '? chen??'),
(8, ' chen '),
(9, 'chen  ?? ??'),
(10, ' chen ?')


SELECT * FROM @t 
WHERE n LIKE '%[?]%' AND n NOT LIKE '%[^? ]%[?]%' AND n NOT LIKE '%[?]%[^? ]%'

输出:

id  n
1   ??
2   ? ?
3    ?
4    ? 
5   ? 
6    ? ? 

答案 2 :(得分:1)

您似乎只是在手动维护操作中执行此操作。如果是这样的话,那就足够了:

where len(replace([EnglishName], '?', '')) = 0

这将用空字符串替换所有?并取长度不包括任何尾随空格 - 所以如果字符串只是 ?和空格,则其长度为将是零。

如果我的假设是错误的并且您正在将此作为您的应用程序的一部分,那么我应该避免这样的黑客攻击。可能 是一种更合理的方法来实现这一目标。

编辑:要处理"的其他约束,请不要选择仅为空格的名称",您只需添加and len([EnglishName]) > 0