2017-07-07 37 views
2

我有兩個表(T-SQL):比賽從一個表中的字符集爲其他表的記錄

tblInvalidCharactersList   tblMonthsRecords 
+-----------+-----------+  +--------+-------------+  
| CodePoint | Character |  | RecRef | Name  | 
+-----------+-----------+  +--------+-------------+ 
| 38  |  &  |  | 21  | Firs> name | 
+-----------+-----------+  +--------+-------------+ 
| 64  |  @  |  | 89  | @Second name| 
+-----------+-----------+  +--------+-------------+ 
| 62  |  >  |  | 321 | Third n«me | 
+-----------+-----------+  +--------+-------------+ 
| 171 |  «  |  | 381 | Fourth name | 
+-----------+-----------+  +--------+-------------+ 

我想找到其中至少有一個tblMonthsRecords這些記錄(或更多)來自tblInvalidCharactersList表格的Character列的字符。

我想:

SELECT 
    [RecRef], 
    [Name] 
FROM [tblMonthsRecords] 
WHERE [Name] IN (SELECT Character FROM [tblInvalidCharactersList]) 

和它在所有不返回任何結果。

我甚至試過NOT IN子句,正如你猜測的那樣,返回所有記錄。

爲什麼我不對LIKE子句中的字符列表進行硬編碼是因爲我希望列表動態更新。

您可以將tblInvalidCharactersList視爲字符「黑名單」。

+0

難道你[像](https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql)嗎? –

回答

1

我的另一種方式將使用exists

select mr.* 
from tblMonthsRecords mr 
where exists (select 1 
       from tblInvalidCharactersList icl 
       where charindex(icl.Character, mr.name) > 0 
      ); 

你似乎不關心實際的無效字符。

+1

的確,我對無效字符漠不關心,你的回答比另一個更準確,更快。 – mchar

+0

如果我必須處理Unicode數據,我必須在字符串前加一個'N',如果是的話,就像是正確的:''N'+ mr.name +'''? – mchar

+0

@mchar。 。 。一點也不。如果你正在處理國家字符集,那麼這兩列應該被聲明爲'nvarchar()',並且代碼應該可以工作。 –

1

IN將尋找確切字符匹配在Name列也不會在Name欄搜索字符

使用LIKE操作

select Distinct a.* 
from tblMonthsRecords a 
join tblInvalidCharactersList b 
    on a.Name like '%' + b.Character + '%' 

使用charindex

charindex(b.Character,a.Name) > 0 
+0

[charindex](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/charindex-transact-sql)似乎正在測試中。然而'Like'方法由於雙重返回的記錄而變慢,'DISTINCT'似乎沒有幫助。 – mchar

+0

@mchar - 使用'Distinct a。*'..現在檢查.. –

+0

所以,我需要使用'LIKE'或''Distinct''。 'JOIN'似乎返回重複數據,並且與其他答案相比較慢。 – mchar

相關問題