1

LIST_CODEこのA101、A102、B101のようなデータが含まれる列名のテーブルがあります。

A102またはB101LIST_CODEと等しいすべてのデータを見つけるにはどうすればよいですか

私は以下のSQLを試しますが、0を返します

SELECT count(*) FROM details_user WHERE list_code IN ('A102','C101')
4

4 に答える 4

1

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 の行がないことを意味します。

于 2013-01-18T08:05:45.300 に答える
0

他の人が言ったように、行にする必要があるデータがある場合は、行に配置します。優れた初期設計に代わるコードはありません。

とはいえ、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でこのアプローチを試すことができます

于 2013-01-18T08:41:18.887 に答える
0

「IN」演算子は離散セットでのみ機能し、あなたが示唆しているような varchar では機能しないと思います。

したがって、通常の OR ステートメントを使用するか、値セットの別の定義を使用する必要があります。

 SELECT count(*) FROM details_user WHERE list_code = 'A102' OR list_code ='C101'
于 2013-01-18T15:22:48.257 に答える
0

クエリの長​​さには制限があるため、「SELECT count(*) FROM details_user RLIKE list_code RLIKE "A102|B100"」のような正規表現を作成することも検討してください。

いずれにせよ、これは適切なスキーマ設計ではありません。

于 2013-01-18T08:12:54.943 に答える