2017-11-02 19 views
1

を取得すると、そのような列がある場合、文字列で区切られた値があります。SQL Serverクエリで、カンマ区切りの文字列行

ユーザーがプログラムから22bまたは24を渡した場合、どのように行2-4を戻すことができますか?

私はあなたが分割のための再帰CTEを使用することができます...これはかなり苦痛になる可能性のあるデータの量に応じて、運

some_column 
------- 
21a 
22b 
21a, 22b, 24, 25 
21a, 22b, 24, 25 
+6

Protip:正規化、@ lad2025が示唆するようにそうあなたは、いくつかの醜いスプリット機能:) – lad2025

+1

で終わるだろうあなたのデータを正規化することは本当に良い考えです。カンマリストではなく単一の値を持つテーブルを作成することです。 – n8wrl

+0

私は好きではないでしょう。他のすべてが失敗したら、 –

答えて

0

で「LIKE」ワイルドカードを試してみました!とにかく、次の例:

DECLARE @t TABLE(
x NVARCHAR(100) 
) 

INSERT INTO @t VALUES ('21a'), ('22b'), ('21a, 22b, 24, 25'), ('21a, 22b, 24, 25'); 


WITH cte AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rn 
     ,X 
    FROM @t t 
), 
cteRec AS(
    SELECT rn, 
      1 lvl, 
      x AS OrigCol, 
      x AS SplitCol 
     FROM cte 
    UNION ALL 
    SELECT rn, 
      lvl+1 AS lvl, 
      SUBSTRING(OrigCol, CHARINDEX(',', OrigCol)+1, LEN(OrigCol) - CHARINDEX(',', OrigCol)), 
      SUBSTRING(OrigCol, 1, CHARINDEX(',', OrigCol)-1) 
     FROM cteRec 
     WHERE CHARINDEX(',', OrigCol) > 0 
), 
cteFilter AS(
    SELECT rn, REPLACE(SplitCol, ' ', '') SplitCol 
    FROM cteRec 
    WHERE CHARINDEX(',', SplitCol) = 0 
) 
SELECT DISTINCT  c.rn, 
        c.x 
    FROM cte AS c 
    JOIN cteFilter AS f ON c.rn = f.rn 
    WHERE f.SplitCol = '24' OR f.SplitCol = '22b' 
    order by rn 
    OPTION (MAXRECURSION 0) 
+0

ちょっと男...これを試してみてください...ありがとう –

+0

SQL 2016以降で互換性レベルが130以上の場合は、SQLに組み込まれているSTRING_SPLIT()関数を使用できます。 –

0

私はあなたのLIKEが機能しなかった理由を、私は従わわかりません。このコードは...私のために〜4行2を返し

create table #test (some_column varchar(20)); 

insert #test values ('21a'), ('22b'), ('21a, 22b, 24, 25'), ('21a, 22b, 24, 25'); 

select * 
from #test 
where some_column like '%22b%' 
     or some_column like '%24%'; 

...

some_column 
-------------------- 
22b 
21a, 22b, 24, 25 
21a, 22b, 24, 25 

(3 rows affected) 
関連する問題