2016-02-26 69 views
1

有人請分享他們在這個複雜模式匹配的專業知識。sql server 2008中的複雜模式匹配

我不知道是否有可能在SQL

DDL

DECLARE @MASTERAPP TABLE 
(
    TYPE VARCHAR (50),  
    Respiration_notes VARCHAR (50) 
) 

INSERT @MASTERAPP 

SELECT 'LUNGSLINE', '20 Inch-OE Size; P-275-55-20; 109S' UNION ALL-- INVALID REMARKS_2 
SELECT 'LUNGSLINE', '20 Inch-OE Size; P-275-55-20; 109S' UNION ALL 
SELECT 'LUNGSLINE', '20 Inch-Plus Size; P-275-55-20; 113S; 9.5' UNION ALL 
SELECT 'LUNGSLINE', '20 Inch-Plus Size; Q-888-XX-20; 113S; 9.5;Maleward,bed no 16' -- INVALID Remarks_1_Value 


DECLARE @CHILD TABLE 
(
    TYPE VARCHAR (50),  
    Remarks_1 VARCHAR (50),  
    Remarks_1_Value VARCHAR (50), 
    Remarks_2 VARCHAR (50),  
    Remarks_2_Value VARCHAR (50) 
) 

INSERT @CHILD 
    SELECT 'LUNGSLINE', 'LUNGS Metric', 'P-275-55-20', 'LungsService', '111T' UNION ALL 
SELECT 'LUNGSLINE', 'LUNGS Metric', 'P-275-55-20', 'LungsService', '117S' UNION ALL 
SELECT 'LUNGSLINE', 'LUNGS Metric', 'P-275-55-20', 'LungsService', '113S' 

我試圖檢查Respiration_notes是否含有正確的值或者不

Respiration_notes應該包含相同的值。在第一個分號後出現的Remarks_1_Value和Respiration_notes中第二個分號後的Remarks_2_Value出現。

兩個表格之間的共同鍵是Type。

感謝您的建議。

輸出

'LUNGSLINE', '20 Inch-OE Size; P-275-55-20; 109S' UNION ALL-- INVALID REMARKS_2_value 

'20 Inch-Plus Size; Q-888-XX-20; 113S; 9.5;Maleward,bed no 16' -- INVALID Remarks_1_Value 
+0

這只是將多個數據嵌入到數據庫的單個列中的許多問題之一(這實際上是您 - 或者設計數據庫的人 - 已經完成)。不要這樣做。我確信可以找到一個解決方案,我會盡快看到是否可以推出一個解決方案,但這只是如果繼續使用此設計將面臨的頭痛問題的開始。 –

+0

我回應了Tom H關於在單個列中嵌入多個值的說法。也許,第一種方法是將多個值拆分爲單獨的列或行(最好在您的設計中,但可以使用具有現有結構的函數完成) - 這將使您的查詢變得更加簡單。 –

+0

@TomH:謝謝湯姆。它的客戶端數據庫,我們沒有任何權利來更改數據庫結構...我們現在正在死亡... :) – akhrot

回答

1

我相信,這會給你你需要的東西:

SELECT 
    MA.TYPE, 
    MA.Respiration_notes 
FROM 
    @MASTERAPP MA 
LEFT OUTER JOIN @CHILD C ON 
    C.TYPE = MA.TYPE AND 
    MA.Respiration_notes LIKE '%; ' + C.Remarks_1_Value + '; ' + C.Remarks_2_Value + '%' 
WHERE 
    C.TYPE IS NULL 

請記住,這依賴於你在你的例子有確切格式。如果在兩個備註之間插入其他文本,或者如果有其他空白等,那麼這將不起作用。這種文本匹配最好的另一個原因是 - 它非常脆弱。

+0

謝謝湯姆...感謝一噸...我只是檢查完整的數據集。 – akhrot

0

您正在尋找like。我想,這是什麼邏輯:

select ma.*, c.* 
from @masterapp ma left join 
    @child c 
    on ma.Respiration_notes like '[^;]; ' + c.Remarks_1_Value + '; ' + Remarks_2_Value + ';%' 
+0

對不起,但這並沒有給出預期的結果。 – akhrot

+0

@akhrot。 。 。可能是因爲你的分號後有空格。您可能需要使用它才能使其適用於您的實際數據。 –

+0

哦!但這是我真實數據的一小部分。不幸的是同樣的時尚。空格需要分號後保留....我運氣不好... :( – akhrot