2015-06-09 65 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