0

以下のクエリを実行すると、4 行ではなく 3 行が取得されます。

SELECT *
FROM freelook
WHERE done_type IN ('14','27','28')

1 行の値はこのようになっているためです1,14,27。これは、1 つの列にカンマで区切られた単一の値です。このように、カンマで区切られた値を持つ多くの行がありますdone_type

値を分離してから、指定された値と一致するかどうかを確認する必要があります。

私のクエリは、値がコンマ区切りの値である文字列であるような行にフィルターを適用する方法です。ガイドしてください。

4

3 に答える 3

4

たとえば、14 を検索するには、次のようにします。

...
WHERE
    done_type = '14'
    OR done_type LIKE '14,%'
    OR done_type LIKE '%,14'
    OR done_type LIKE '%,14,%'

27、28、および検索したいその他の番号をすすぎ、繰り返します...

ただし、これはひどく実行されます (テーブル全体のスキャン)。

さびにペンキを塗る代わりに、根本的な問題1を解決し、2 つのテーブルに分割してデータを正規化することをお勧めします。


1原子性の原則、したがって 1NF に違反すること。

于 2012-09-10T10:03:31.513 に答える
1

次の SQL を使用できます (「id」が PK 列であると仮定します)。

WITH tokens as (
SELECT distinct id, token
FROM        
(SELECT  
id,
SUBSTR (csv,
  INSTR (csv, ',', 1, LEVEL  ) + 1,
  INSTR (csv, ',', 1, LEVEL+1) - INSTR (csv, ',', 1, LEVEL) -1 
  ) AS token
FROM (
  SELECT  id, ','||trim(done_type||',') csv FROM freelook) 
  CONNECT BY LEVEL <= LENGTH(csv)-LENGTH(REPLACE(csv,',',''))+1)
  WHERE token is not NULL)

SELECT id FROM tokens
WHERE token in ('14','27','28')
ORDER BY id, token
于 2012-09-10T12:58:43.103 に答える