2016-03-31 91 views
0

我有下列值SQL列正則表達式匹配在SQL列下列輸入

ReportID 
-------- 
19 
19,20,21 
20,19,21 
20,21,19 
119,21 
1191,21 

我需要匹配其具有19的值的行(即拒絕最後兩行)

有沒有更好的方法來做到這一點比下面使用的查詢? (使用正則表達式組合)

我的查詢:

SELECT * 
FROM [StoreBI_Validation].[dbo].[PortalNotifications] 
WHERE ReportID like '%,19,%' 
    or ReportID like '19' 
    or ReportID like '19,%' 
    or ReportID like '%,19' 
+2

正確的解決方案是**不**將逗號分隔值存儲在列中。如果你正確地規範你的數據你不會有這個問題。一個快速的解決方法是存儲前導和尾隨逗號,例如',20,19,21,'那麼你使用'%,19,%'已經足夠了 –

+0

如果你規範化數據,你不僅不會遇到這個問題,而且你的查詢可以更快地工作,因爲你可以使用索引在reportID列上。沒有辦法在當前查詢中使用索引。 –

回答

4

試試這個:

SELECT * 
FROM Test 
WHERE ','+ReportID+',' like '%,19,%' 

SQL Fiddle

或者這樣:

SELECT DISTINCT reportid 
FROM (
    SELECT A.ReportID 
     ,Split.a.value('.', 'VARCHAR(100)') AS Data 
    FROM (
     SELECT ReportID 
      ,CAST('<M>' + REPLACE(ReportID, ',', '</M><M>') + '</M>' AS XML) AS Data 
     FROM Test 
     ) AS A 
    CROSS APPLY Data.nodes('/M') AS Split(a) 
    ) B 
WHERE Data = '19'; 
1
SELECT * 
FROM [StoreBI_Validation].[dbo].[PortalNotifications] 
WHERE CHARINDEX(',19,',ReportID)>0