2017-10-14 12 views
1

POSTSQL Server 2008カンマで区切られた文字列を1つの列からクエリする方法は?

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

質問:

  1. カンマ区切りの文字列にタグ= 'B' を持つレコードを選択するには?上記の例では、レコード1,2が返されます。

  2. タグ= 'B'と作成者= 'y'のレコードを選択するにはどうすればよいですか?返されたレコードは、BTW 1

する必要があります:私は、その後、3つのテーブルPOSTTAGAUTHORにデータベーススキーマを再設計、内部JOIN句をすることによって、望ましいレコードを照会する場合。以前の方法と比較して、これはパフォーマンスが優れていますか?テーブルPOSTには、合計で10,000レコードあります。

+0

リスト内でリストを検索すると、文字列レベルでこれを行うことはできません! 'A、B、C、D'で' A'を見つけたい場合は 'B、C'と同じように簡単です。しかし、 'C、B'や' A、C'はどうでしょうか?そのような値**は別々のテーブルに保存する必要があります**。あなたの場合は、投稿、タグ、著者のテーブルとそれらの間のマッピングテーブルを備えた古典的な 'm:n'デザインを提案します。 Btw:10.000のレコードはあまりない... – Shnugo

答えて

3

明らかに、区切り文字列としてリストを格納することは、SQLに値を格納する間違った方法です。時々、私たちは他の人の本当に悪いデザインに悩まされていますが、最初のステップは本当にデータモデルを修正することです。あなたが行うことができ、あなたがやりたい

、:

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

2番目の質問は似ていますcharindexの使用に関する

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

ありがとう。フィルタ値は、製造中の単一の「B」以外の「B、C」であってもよい。したがって、これらのレコードがNoSQLデータベースにJSON形式で格納されることをお勧めします(例: LiteDB? –

+0

SQLにリストを格納する適切な方法は、リストとしての値が1行のテーブルとしてあります。 –

0

どのように?

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

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

Fiddle

+0

オンラインデモありがとうございます。フィルタ値は、製造中の単一の「B」以外の「B、C」であってもよい。 –

+0

'' B'''を '' B、C'''に置き換えても、それでも機能するはずです。 – Psidom

+0

しかし、 'B、D'ではなく... – Shnugo

関連する問題