を取得すると、そのような列がある場合、文字列で区切られた値があります。SQL Serverクエリで、カンマ区切りの文字列行
ユーザーがプログラムから22bまたは24を渡した場合、どのように行2-4を戻すことができますか?
私はあなたが分割のための再帰CTEを使用することができます...これはかなり苦痛になる可能性のあるデータの量に応じて、運
some_column
-------
21a
22b
21a, 22b, 24, 25
21a, 22b, 24, 25
を取得すると、そのような列がある場合、文字列で区切られた値があります。SQL Serverクエリで、カンマ区切りの文字列行
ユーザーがプログラムから22bまたは24を渡した場合、どのように行2-4を戻すことができますか?
私はあなたが分割のための再帰CTEを使用することができます...これはかなり苦痛になる可能性のあるデータの量に応じて、運
some_column
-------
21a
22b
21a, 22b, 24, 25
21a, 22b, 24, 25
で「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)
ちょっと男...これを試してみてください...ありがとう –
SQL 2016以降で互換性レベルが130以上の場合は、SQLに組み込まれているSTRING_SPLIT()関数を使用できます。 –
私はあなたの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)
Protip:正規化、@ lad2025が示唆するようにそうあなたは、いくつかの醜いスプリット機能:) – lad2025
で終わるだろうあなたのデータを正規化することは本当に良い考えです。カンマリストではなく単一の値を持つテーブルを作成することです。 – n8wrl
私は好きではないでしょう。他のすべてが失敗したら、 –