比赛从一个表中的字符集为其他表的记录

问题描述:

我有两个表(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)吗? –

我的另一种方式将使用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()',并且代码应该可以工作。 –

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