2017-10-14 3 views
1

Tabelle POST:SQL Server 2008 wie kommabegängige Zeichenfolge aus einer Spalte abfragen?

postId Tag Author 
----------------------- 
1  A,B x,y 
2  B,C,D x 
3  C,D y 

Fragen:

  1. Wie Datensätze auszuwählen, die Tag = 'B' in dem Komma getrennte Zeichenfolge haben? Aus dem obigen Beispiel sollte der Datensatz 1,2 zurückgegeben werden.

  2. Wie Datensätze auswählen, die Tag = 'B' und Autor = 'y' haben? Die zurückgegebenen Datensätze sollten 1.

BTW sein: Wenn ich Datenbank-Schema in drei Tabellen POST Redesign, TAG und AUTHOR, dann die gewünschten Datensätze abfragen, indem innere Join-Klausel. Verglichen mit der früheren Methode, die besser in der Leistung ist? Die Tabelle POST hat insgesamt 10 tausend Datensätze.

+0

Wenn Sie nach einer Liste in einer Liste suchen möchten, können Sie dies nicht auf String-Ebene tun! Wenn Sie ein 'A' in' A, B, C, D' finden wollen, ist es einfach, gleiches mit 'B, C'. Aber was ist mit "C, B" oder "A, C"? Solche Werte ** müssen in separaten Tabellen gespeichert werden **. In Ihrem Fall würde ich ein klassisches 'm: n'-Design mit Tabellen für Posts, Tags und Autoren und Mapping-Tabellen zwischen ihnen vorschlagen. Btw: 10.000 Datensätze ist nicht viel ... – Shnugo

Antwort

3

Offensichtlich wissen Sie, dass das Speichern von Listen als Zeichenfolgen mit Trennzeichen die falsche Methode zum Speichern von Werten in SQL ist. Manchmal hängen wir mit den wirklich schlechten Designs anderer Leute zusammen, aber der erste Schritt sollte wirklich sein, das Datenmodell zu reparieren.

zu tun, was Sie wollen, können Sie tun:

select * 
from t 
where ',' + tag + ',' like '%,B,%' 

Die zweite Frage ist ähnlich:

where ',' + tag + ',' like '%,B,%' and 
     ',' + author + ',' like '%,y,%' 
+0

Danke. Der Filterwert kann "B, C" anders als ein einzelnes "B" in der Produktion sein. Also, wäre die bessere Wahl, dass diese Datensätze in der NoSQL-Datenbank im JSON-Format gespeichert werden, z.B. LiteDB? –

+0

Die richtige Methode zum Speichern einer Liste in SQL ist eine Tabelle mit einer Zeile pro Listenwert. –

0

Wie wäre es charindex mit?

select * from table1 where charindex('B', tag) <> 0; 

select * from table1 where charindex('B', tag) <> 0 and charindex('y', author) <> 0; 

Fiddle.

+0

Vielen Dank für Ihre Online-Demo. Der Filterwert kann "B, C" anders als ein einzelnes "B" in der Produktion sein. –

+0

Es sollte immer noch funktionieren, wenn Sie "B" durch "B, C" ersetzen. – Psidom

+0

Aber nicht mit 'B, D' ... – Shnugo

Verwandte Themen