2012-02-23 8 views
1

図のようにカンマで区切って「science,maths,english」と言うカテゴリの列がある場合、すべての行をmathsを含むカテゴリとどのように一致させるのですか?列のカンマ区切り値を一致させよ

私は単純なLIKEを試しましたが、'%science%'を検索すると両方に一致する 'poo_science'がある可能性があるため、正確ではありません。

私はStackOverflowを見てきましたが、似たような質問がたくさんありますが、すべてデータをカンマ区切りのリストなどで返すように思えます。

私はストアドプロシージャを使用しないで、フルテキスト検索を使用することはできません。私はそれぞれの値の周りに別の文字を追加した('$')を使用したスト​​アドプロシージャを持っていて、それで'$value$'...を検索するのはこれほど厄介ですか?私はもう少し単純な方法の後です。

+9

これは、複数値の属性が** evil **である理由です。 – Yuck

+0

@Yuck並行性の問題の増加は、なぜ彼らが**悪**なのかと思った。 –

+5

私はこのデザインを立てる方法はありません。データの子テーブルが必要なので、それを効果的に吟味することができます。カンマ区切りのリストは絶対に保存しないでください。 – HLGEM

答えて

9

免責事項:解説者は正しいです...単一のフィールドにあるCSVは恐ろしいデザインなので、再作成する必要があります。そうは言って

は、ここにあなたがあなたの問題を回避できる方法は次のとおりです。

パッドCategoriesは、先頭と,末尾に、あなたはワイルドカード検索に含めることができる方法:

WHERE (',' + Categories + ',') LIKE '%,science,%' 
+0

小さな構文エラーが修正されました。このソリューションは機能し、XMLソリューションよりも高速になります。 (もちろん、まだテーブルスキャンまたはインデックススキャンが必要です)。 – usr

2

私がしましたあなたのデータレイアウトについていくつかの前提がありました。間違いなく超効率的または非常にスケーラブルであることを行っていないが、その後、これらの問題を本質的になる傾向にある非正規化データに対して働いている

DECLARE @SearchString NVarChar(100) = 'maths'; 

SELECT 1 SomeId, 'science,maths,english' Categories 
INTO #TestTable; 

WITH R AS (
    SELECT 
    X.SomeId, 
    C.value('@value', 'NVarChar(100)') SomeTagValue 
    FROM (SELECT SomeId, 
      CONVERT(XML, '<tag value = "' + REPLACE(Categories, ',', '" /><tag value = "') + '" />') XMLValue 
     FROM #TestTable) X CROSS APPLY X.XMLValue.nodes('//tag') T(C) 
) 
SELECT * 
FROM R 
WHERE SomeTagValue = @SearchString; 

DROP TABLE #TestTable; 

:SQL Serverの2K8を使用して+この作業をする必要があります - これを試してみてください。

5

使用FIND_IN_SET(、)

SQL:

SELECT name FROM orders,company 
WHERE orderID = 1 
AND 
FIND_IN_SET(companyID, attachedCompanyIDs) 

または このリンクをチェックすることができFIND_IN_SET() vs IN()

+0

Whoa!コンマで区切られた列のための優れたソリューション!すべての例外的なケースも処理します。受け入れられた答えの一つであったはずです! – jahackbeth

+0

FIND_IN_SETはMySQLのみです。優れたソリューションですが、SQL Serverでは使用できません。 – snort

1

この質問は、Googleで表示され、多くのビューを持っているので、私はこの問題への私のアプローチを共有したい:

詳細情報はリンクの下に従ってください。私はコンマ区切りの値も文字列として保存されているので、そのような貧弱なデザインに対処しなければなりませんでした。私はタグを担当するCMSのプラグインを微調整しながら、この問題に遭遇しました。

サイトの記事に関連するタグは、次のように保存されました: "tag1、tag2、...ボールボール「と 『ボール『タグの付いたIも得たものを』:、TAGNは」。シンプルLIKEを使用して、記事をタグ付けしてだから、完全一致を取得することは、最初に登場しているかもしれないほど簡単ではありませんでした』部屋」。重要なのではなく、迷惑なわけではありません。

FIND_IN_SET機能が最初で素晴らしい見えたが、その後、それがインデックスを使用しないと、最初の引数はコンマ文字が含まれている場合は正常に動作しないことが判明しました。

私は、プラグイン自体や深いCMSコアを変更したくはありませんでしたそのプラグインが構築された機能

また、このコード部分WHERE (',' + Categories + ',') LIKE '%,science,%'は、必要なタグ(部分文字列)が最初の文字列、最後の文字列、中間のどこかにある可能性があることに注意してください。

最後に、私は非常に単純な解決策に終わった。それはこのように私の仕事:カバー

... WHERE tags LIKE 'ball,%' OR tags LIKE '%,ball,%' OR tags LIKE '%,ball'

すべてtheree例。区切り記号として使用されるカンマ同じような落とし穴に出くわした人たちを助けてくれることを願います

PS。私はMySQL/DBのエキスパートではありません。このアプローチの潜在的な欠点について、特に大きなテーブル(特に私の場合ではない、btw)について読んでみたいと思います。私はちょっとした努力をしてこの問題を解決するために私が行った小さな研究の結果を共有しました。

関連する問題