将一个表中的一组字符与另一个表

时间:2017-07-07 10:54:45

标签: sql tsql

我有两个表(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 |
+-----------+-----------+        +--------+-------------+

我想找到tblMonthsRecordsCharacter表的tblInvalidCharactersList列中至少有一个(或多个)字符的记录。

我试过了:

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

并且根本不会返回任何结果。

我甚至尝试了NOT IN子句,正如您猜测的那样,返回所有记录。

我没有在LIKE子句中对字符列表进行硬编码的原因是因为我希望动态更新列表。

您可以将tblInvalidCharactersList视为字符“黑名单”。

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

我会使用exists

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

你似乎并不关心实际的无效角色。