2017-07-07 1 views
2

Ich habe zwei Tabellen (T-SQL):Spiel ein Satz von Zeichen aus einer Tabelle in die Aufzeichnungen einer anderen Tabelle

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

ich die Aufzeichnungen der tblMonthsRecords finden will, die mindestens eine haben (oder mehr) Zeichen aus der Character Spalte der tblInvalidCharactersList Tabelle.

Ich habe versucht:

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

und es gibt überhaupt keine Ergebnisse.

Ich probierte sogar die NOT IN Klausel und wie Sie vielleicht erraten werden, gibt alle Datensätze zurück.

Der Grund, warum ich die Zeichenliste in einer LIKE-Klausel nicht hartcodiere, ist, weil ich möchte, dass die Liste dynamisch aktualisiert wird.

Sie können die tblInvalidCharactersList als Zeichen "schwarze Liste" denken.

+0

Sie nicht [wie] (https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql) es? –

Antwort

1

I LIKE Betreiber suchen würde exists verwenden:

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

Sie scheinen sich nicht um das tatsächliche ungültige Zeichen zu kümmern.

+1

Genau, mir ist der ungültige Charakter egal und Ihre Antwort ist genauer und schneller als die andere. – mchar

+0

Wenn ich mit Unicode-Daten umgehen müsste, müsste ich meine Zeichenfolge mit einem "N" voranstellen und wenn ja, so ist das richtig: ''N' + mr.name + '''? – mchar

+0

@ mchar. . . Ganz und gar nicht. Wenn Sie mit nationalen Zeichensätzen arbeiten, sollten die Spalten * beide * als 'nvarchar()' deklariert werden, und der Code sollte einfach funktionieren. –

1

IN wird in Name Spalte für genaue Charakter Spiel schauen sie nicht für das Zeichen in Name Spalte

Verwenden

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

Eine weitere Möglichkeit, mit charindex

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

[charindex] (https://docs.microsoft.com/en-us/sql/t-sql/functions/charindex-transact-sql) scheint unter Test zu arbeiten. Der "Like" -Ansatz wird jedoch aufgrund der doppelten zurückkehrenden Datensätze langsam und 'DISTINCT' scheint nicht zu helfen. – mchar

+0

@mchar - verwenden 'Distinct a. *' .. überprüfen Sie jetzt .. –

+0

So muss ich 'Distinct' entweder mit' LIKE' oder nicht. 'JOIN' scheint Duplikate zurückzugeben und ist im Vergleich zu der anderen Antwort langsamer. – mchar

Verwandte Themen