シーケンスを考慮せずに文字列区切り文字列とSQLの列値を比較するにはどうすればよいですか?シーケンスを考慮せずに文字列区切り文字列とSQLの列値を比較する方法
私はSQLの列[果物] - マンゴー、リンゴ、チェリーの値を持っていると仮定...私はasp.netのC#チェリー、マンゴー、リンゴのリストを持って...私はそれができるようにSQLクエリを書く順序なしでSQLテーブルに一致します。
シーケンスを考慮せずに文字列区切り文字列とSQLの列値を比較するにはどうすればよいですか?シーケンスを考慮せずに文字列区切り文字列とSQLの列値を比較する方法
私はSQLの列[果物] - マンゴー、リンゴ、チェリーの値を持っていると仮定...私はasp.netのC#チェリー、マンゴー、リンゴのリストを持って...私はそれができるようにSQLクエリを書く順序なしでSQLテーブルに一致します。
私はあなたがこの中に素晴らしい答えを見ていることをSO疑問示唆、あなたのソリューションは、この機能に単語が含まれている各列を通過し、その後に保管すべきだ
How to split a comma-separated value to columns
列IDと一緒にテーブルを作成します。
だから、「マンゴー、りんご、桜は」値
ColdID Value
_______________
1 mango
1 apple
1 cherry
とテーブル今すぐたcolidのASC、バリューASCでテーブルを注文するとテーブルの両方を比較になります。
投稿されたリンクで受け入れられた回答を使用しないでください。その答えはひどく非効率な文字列を分割するループを使用しています。一番良い方法は、区切られたデータを格納しないことですが、ここで分割オプションをチェックアウトすることです。 http://sqlperformance.com/2012/07/t-sql-queries/split-stringsループを使用せずに設定される多くのオプション。 –
これはそれを行う必要があります。
DECLARE @str NVARCHAR(MAX)
, @Delim NVARCHAR(255)
SELECT @str = 'cherry,mango,peach,apple'
SELECT @Delim = ','
CREATE TABLE #Fruits (Fruit VARCHAR(255))
INSERT INTO #Fruits
(Fruit)
VALUES ('cherry'),
('Mango'),
('Apple') ,
('Banana')
;WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0)
,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4
,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16
,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256
,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536
,lv5 AS (SELECT 0 g FROM lv4 a CROSS JOIN lv4 b) -- 4,294,967,296
,Tally_CTE (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv5)
SELECT SUBSTRING(@str, N, CHARINDEX(@Delim, @str + @Delim, N) - N) AS Item
INTO #StrTable
FROM Tally_CTE
WHERE N BETWEEN 1 AND DATALENGTH(@str) + DATALENGTH(@Delim)
AND SUBSTRING(@Delim + @str, N, LEN(@Delim)) = @Delim;
--#############################################################################
-- in both
--#############################################################################
SELECT *
FROM #Fruits F
JOIN #StrTable ST ON F.Fruit = ST.Item
--#############################################################################
-- in table but not string
--#############################################################################
SELECT *
FROM #Fruits F
LEFT JOIN #StrTable ST ON ST.Item = F.Fruit
WHERE ST.Item IS NULL
--#############################################################################
-- in string but not table
--#############################################################################
SELECT *
FROM #StrTable ST
LEFT JOIN #Fruits F ON ST.Item = F.Fruit
WHERE F.Fruit IS NULL
GO
DROP TABLE #Fruits
DROP TABLE #StrTable
これを行うには、string_split関数を使用できます。私はこれをSQL Server 2017 ctp 2.0でテストしましたが、2016でも動作するはずです。
drop table if exists dbo.Fruits;
create table dbo.Fruits (
Fruits varchar(100)
);
insert into dbo.Fruits (Fruits)
values ('cherry,mango,apple'), ('peanut,cherry,mango'),
('apple,cherry,mango')
declare @str varchar(100) = 'apple,mango,cherry';
select
tt.Fruits
, COUNT(tt.value) as Value01
, COUNT(app.value) as Value02
from (
select
*
from dbo.Fruits f
outer apply string_split (f.Fruits, ',') t
) tt
left join string_split (@str, ',') app on tt.value = app.value
group by tt.Fruits
'a、b、c 'を1行にするのではなく、' a'、 'b'、' c'の3つの行があると簡単に考えてください。カンマで区切られた値を使うことは、ほとんど例外なく、恐ろしいデザインの選択です。 –
私はフルーツの列を持っていると私はコンマ区切りで保存する必要があります...私の要求のため – faux
pls helppp ppppppp – faux