2012-07-20 41 views
0

您好我有我的數據庫中的兩個表,一個登記表一中「註冊人名稱」字段和其他信息和參考/查找表包含一個名爲「Business_Identifier」列SQL比較註冊人名稱的參考表

這個想法是將「註冊人名稱」字段中的數據與「Business_Identifier」列中包含的數據進行比較,以確定「註冊人名稱」字段中包含的數據是公司或個人的數據。

一個例子是:

Registrant Table: 
ID: 1234 
Registrant NAme: ABC Ltd 


Lookup Table: 
ID:1,2,3      
Business_Identifier: ltd,PLC,LLC 

我正在創建一個存儲過程,它將執行某種形式的匹配查找表數據並查看它是否出現在「註冊人名稱」字段中,從而將該記錄標識爲業務。

我創建了一個腳本carrys了靜態列表模式匹配,見下面的例子,但我需要把靜態列表插入表,以便它可以被更新

當前腳本:

With Test as (
SELECT *  
    FROM [Registrant_Table] 
    where (patindex('%[0-9]%',UPPER([Registrant name])) > 0 
    or patindex('%null%',UPPER([Registrant name])) > 0 
    or patindex('%n/a%',UPPER([Registrant name])) > 0  
    or patindex('na',UPPER([Registrant name])) > 0 
    or patindex('%LTD%',UPPER([Registrant name])) > 0 
    or patindex('%None%',[Registrant name]) > 0 
    or patindex('%unknown%',[Registrant name]) > 0 
    or patindex('%Ltd%',[Registrant name]) > 0 
    or patindex('%ltd%',[Registrant name]) > 0 
    or patindex('%LLC%',[Registrant name]) > 0 
    or patindex('%LLc%',[Registrant name]) > 0  
    or patindex('%LLP%',[Registrant name]) > 0 
    or patindex('%LLp%',[Registrant name]) > 0  
    or patindex('%llp%',[Registrant name]) > 0 
    or patindex('%Limited%',[Registrant name]) > 0   
    or patindex('%LIMITED%',[Registrant name]) > 0 
    or patindex('%Limi%',[Registrant name]) > 0 
    or patindex('%Company%',[Registrant name]) > 0 
    or patindex('%Tele%',[Registrant name]COLLATE Latin1_General_CS_AI) > 0 
    or patindex('%Trade%',[Registrant name]) > 0 
    or patindex('%Host%',[Registrant name]) > 0 
    or patindex('%Domain%',[Registrant name]) > 0 
    ) 

select * 
Into [Registrant_Table_Business] 
from Test 

任何幫助,將不勝感激

感謝

回答

0

如果查找表定義upper位列collation,您可以使用:

SELECT *  
    FROM [Registrant_Table] r 
CROSS JOIN [PatternLookup] l 
WHERE patindex('%' + l.Pattern + '%', 
     case when l.IsUpper = 1 
      then case when l.IsLatin1_General_CS_AI = 1 
        then upper (r.[Registrant name]) COLLATE Latin1_General_CS_AI 
        else upper (r.[Registrant name]) 
        end 
      else case when l.IsLatin1_General_CS_AI = 1 
         then r.[Registrant name] COLLATE Latin1_General_CS_AI 
         else r.[Registrant name] 
        end 
     end) > 0 

UPDATE:創建表的模式:

create table PatternLookup 
(
    PatternLookupID int identity primary key, 
    Pattern nvarchar(100) not null, 
    IsUpper bit default 0 not null, 
    IsLatin1_General_CS_AI bit default 0 not null 
) 

很少刀片:

insert into PatternLookup (Pattern, isUpper, IsLatin1_General_CS_AI) values 
      ('LTD', 1, 0), -- This pattern asks for uppercased [Registrant name] 
      ('Tele', 0, 1), -- This one needs registrant in different collation 
      ('Company', 0, 0)-- And this one is as-is 
+0

嗨@Nikola,我覺得你的右邊線,我查看了您的查詢並試圖運行它,但遇到以下錯誤:消息207,級別16,狀態1,行5 列名稱'IsUpper'無效。 消息207,級別16,狀態1,行6 無效的列名稱'IsLatin1_General_CS_AI'。 消息207,級別16,狀態1,行10 無效的列名稱'IsLatin1_General_CS_AI'。 – 2012-07-20 11:08:20

+0

@MarkSouthwell哦,我建議你把這兩列添加到查找表中,以便能夠控制如何進行模式匹配;我注意到有時候你在比較Upper([註冊人名稱]),而在一個實例中,你正在改變整理。 – 2012-07-20 11:18:16

+0

@MarkSouthwell請檢查我編輯的答案。 – 2012-07-20 11:24:11