2015-06-09 17 views
0

我有一个varchar列插入了一些nvarchar数据,所以我现在有记录包含数据,如'? ???”正在寻找?和MSSQL中的空格

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

返回的一切,和LIKE '[? ]'其他变化不回我之后的数据。

如何选择只包含问号的记录,以及是否包含空格?

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

回答

4

使用一个额外的谓词来过滤掉非?或空格字符:

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

上面会包含只是空间选择记录。如果您想将这些记录过滤掉为好,然后只需使用:

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

这也将返回记录只有空格,我需要排除他们(另一个团队将处理数据清理) – StormRider01

+0

@ StormRider01你检查了我所做的编辑?它解决了这个问题。 –

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 ? ? 
1

好像你只是这样做作为手动维护操作的一部分。如果是这样的话,这可能是不够好:

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

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

如果我的假设是错误的,并且你正在使用它作为你的应用程序的一部分,我会避免这样的黑客。有可能一个更合理的方式来完成这一点。

编辑:要处理“不要选择只有空格的名称”的附加约束,您可以添加and len([EnglishName]) > 0

+0

可以有空格 –

+0

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

+1

如果可以有空格'where len(替换(替换([EnglishName],'?',''),'','?'))= 0' – Max