2017-05-17 13 views
-1

シーケンスを考慮せずに文字列区切り文字列とSQLの列値を比較するにはどうすればよいですか?シーケンスを考慮せずに文字列区切り文字列とSQLの列値を比較する方法

私はSQLの列[果物] - マンゴー、リンゴ、チェリーの値を持っていると仮定...私はasp.netのC#チェリー、マンゴー、リンゴのリストを持って...私はそれができるようにSQLクエリを書く順序なしでSQLテーブルに一致します。

+1

'a、b、c 'を1行にするのではなく、' a'、 'b'、' c'の3つの行があると簡単に考えてください。カンマで区切られた値を使うことは、ほとんど例外なく、恐ろしいデザインの選択です。 –

+0

私はフルーツの列を持っていると私はコンマ区切りで保存する必要があります...私の要求のため – faux

+0

pls helppp ppppppp – faux

答えて

0

私はあなたがこの中に素晴らしい答えを見ていることをSO疑問示唆、あなたのソリューションは、この機能に単語が含まれている各列を通過し、その後に保管すべきだ

How to split a comma-separated value to columns

列IDと一緒にテーブルを作成します。

だから、「マンゴー、りんご、桜は」値

ColdID Value 
_______________ 
1  mango 
1  apple 
1  cherry 

とテーブル今すぐたcolidのASC、バリューASCでテーブルを注文するとテーブルの両方を比較になります。

+0

投稿されたリンクで受け入れられた回答を使用しないでください。その答えはひどく非効率な文字列を分割するループを使用しています。一番良い方法は、区切られたデータを格納しないことですが、ここで分割オプションをチェックアウトすることです。 http://sqlperformance.com/2012/07/t-sql-queries/split-stringsループを使用せずに設定される多くのオプション。 –

0

これはそれを行う必要があります。

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 
0

これを行うには、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 
関連する問題