我有一个varchar
列,其中插入了一些nvarchar
数据,所以我现在有包含'?'等数据的记录? ???“
select * from table where EnglishName LIKE '%[? ]%'
返回所有内容,LIKE '[? ]'
的其他变体不会返回我之后的数据。
如何选择仅包含问号的记录,并可选择包含空格?
'??' - return
'? ?' - return
' ?' - return
'? chen' - don't return
' ' - don't return
' chen' - don't return
答案 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
。