LIST_CODE
このA101、A102、B101のようなデータが含まれる列名のテーブルがあります。
A102またはB101LIST_CODE
と等しいすべてのデータを見つけるにはどうすればよいですか
私は以下のSQLを試しますが、0を返します
SELECT count(*) FROM details_user WHERE list_code IN ('A102','C101')
LIST_CODE
このA101、A102、B101のようなデータが含まれる列名のテーブルがあります。
A102またはB101LIST_CODE
と等しいすべてのデータを見つけるにはどうすればよいですか
私は以下のSQLを試しますが、0を返します
SELECT count(*) FROM details_user WHERE list_code IN ('A102','C101')
list_code に 'A101, A102,B101' を 1 行に含めることができるということであれば、
select * from details_user
where list_code like'%A102%'
or list_code like '%B101%'
しかし、これはデータベースの設計としては不適切です。
list_code に含めることができる場合
A101
A102
B101
(行ごとに 1 つの値)
次に、コードは正しいです。これは、A102 または C101 の行がないことを意味します。
他の人が言ったように、行にする必要があるデータがある場合は、行に配置します。優れた初期設計に代わるコードはありません。
とはいえ、SQL Server 2005 以降で xml 関数を使用すると、1 つの行にパックされたデータをより管理しやすい状況に変換できます。次のようなことができます:
select du.ID, Code.value('.','nvarchar(100)') as Code
from (select ID,
cast(('<c>'+replace(list_Code,',' ,'</c><c>')+'</c>') as xml) as xml
from details_user) du
cross apply du.xml.nodes('c') as T(Code)
これにより、最初に文字列がフォーマットから'A101, A102'
XML に似たフォーマットに変換されます
'<c>A101</c><c>A102</c>'
。
次に、変換された値が、コードをテーブルに分割するnodes()関数に供給され、そのテーブルから、コードの値がvalue()メソッドを使用して抽出されます。
このSQL Fiddleでこのアプローチを試すことができます
「IN」演算子は離散セットでのみ機能し、あなたが示唆しているような varchar では機能しないと思います。
したがって、通常の OR ステートメントを使用するか、値セットの別の定義を使用する必要があります。
SELECT count(*) FROM details_user WHERE list_code = 'A102' OR list_code ='C101'
クエリの長さには制限があるため、「SELECT count(*) FROM details_user RLIKE list_code RLIKE "A102|B100"」のような正規表現を作成することも検討してください。
いずれにせよ、これは適切なスキーマ設計ではありません。