3

「Categories」という列がscience,maths,englishあり、行がカンマで区切られている場合、すべての行をカテゴリに一致させるにはどうすればよいmathsですか?

簡単に試してみましたLIKEが、検索時に両方に一致する「poo_science」がある可能性があるため、正確ではありません'%science%'

私は StackOverflow を見回しましたが、同様の質問がたくさんありますが、すべてデータをコンマ区切りのリストなどとして返したいようです-私が求めているものではありません。

ストアド プロシージャを使用したくないので、全文検索を使用できません。('$')各値の周りに別の文字を追加して検索するストアド プロシージャを使用しました'$value$'...が、これはあまりにも厄介ですか? 私はもう少し簡単な方法を求めています。

4

6 に答える 6

11

免責事項: コメンテーターは正しいです... 単一フィールドの CSV はひどい設計であり、やり直す必要があります。

そうは言っても、問題を回避する方法は次のとおりです。

ワイルドカード検索に含めることができるように、Categories先頭と末尾にパディングします。,

WHERE (',' + Categories + ',') LIKE '%,science,%'
于 2012-02-23T22:17:07.003 に答える
7

FIND_IN_SET(,) を使用する

SQL:

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

または、このリンクFIND_IN_SET() vs IN()を確認できます

于 2013-06-07T04:11:13.820 に答える
2

私はあなたのデータレイアウトについていくつかの仮定をしました。これを試してください-SQLServer2K8 +を使用すると、これは機能するはずです。

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;

それは間違いなく超効率的または非常にスケーラブルになることはありませんが、非正規化されたデータに対して作業することは本質的にそれらの問題を抱えている傾向があります。

于 2012-02-23T22:18:21.027 に答える
1

FIND_IN_SET() mysql 関数を使用する

構文

SELECT * FROM as a WHERE FIND_IN_SET(value to search in string,comma separated string);

SELECT * FROM as a WHERE FIND_IN_SET(5,"1,2,3,4,5,6");

詳細については、以下のリンクに従ってください:

http://blog.sqlauthority.com/2014/03/21/mysql-search-for-values-within-a-comma-separated-values-find_in_set/

于 2016-12-27T13:50:53.270 に答える