2009-05-05 8 views
1

私はSQLで効率的にしたいと考えています。Sql Un-Wizardry:別のリストの値を比較する

入力フィールド(fldInputField)が "1,3,4,5"

のカンマ区切りのリストであるデータベースは、」1,2,3,4,5を含むフィールド(fldRoleList)を有します6,7,8 "

したがって、fldRoleList内のfldInputFieldが最初に出現した場合は、その値を教えてください。

MySQLまたはストアドプロシージャで次のように達成する方法はありますか?

擬似コード

SELECT * 引数aTable T1からt1.fldRoleList

でfldInputField

/疑似コード

は、私が最も適しているいくつかの機能であるかもしれないが推測している このタイプの比較?私は検索で何かを見つけることができなかった、誰かが私を指示することができれば私は質問を削除します...ありがとう!

更新:これは物事を行うのに理想的な方法ではありません。これは継承されたコードであり、私たちは、正規化された行を使ってこれを処理するロジックを構築する際に、簡単に修正しようとしています..幸いにもこれはあまり使われていないコードです。

+0

私はあなたが望むものに完全に明確ではありませんよ。あなたはいくつかの価値観と結果をあなたに見せてもらえますか?たとえば、両方のリストに「1」が表示されるため、指定した値を使用すると正しい結果が「1」になります。 –

答えて

3

私は、カンマ区切りのリストは正規化されたデータベースの設計で場所がないことを@Kenホワイトのanswerに同意します。

ソリューションを使用すると、従属テーブル内fldRoleListとして複数行格納されている場合は、より良い実行簡単かつ次のようになります。

SELECT t1.*, r1.fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField); 

を(MySQLの機能FIND_IN_SET()を参照)

しかし、それは複数の行を出力し複数のロールがカンマで区切られた入力文字列と一致する場合あなたは最初マッチングの役割と、aTableエントリごとに1つの行に結果を制限する必要がある場合:

SELECT t1.*, MIN(r1.fldRole) AS First_fldRole 
FROM aTable t1 JOIN aTableRoles r1 USING (aTable_id) 
WHERE FIND_IN_SET(r1.fldRole, fldInputField); 
GROUP BY t1.aTable_id; 
+0

混乱していますが、find_in_setは非正規化解に対して有益ではありませんか?質問は*最初の値を求めているようですね? – Andomar

+0

find_in_set()関数は、* 1つの*値をコンマ区切りの文字列で検索します。 OPの質問は、1つのコンマ区切り文字列を2番目のカンマ区切り文字列と比較し、最初の一致文字列を見つけることでした。 Find_in_set()はそれを行うことはできません。私の例では、正規化されたテーブルデザインを使用しています。 –

+0

ありがとうございました。これは継承されたコードであり、複数の行にfldRoleListを格納することを検討しています...行を追加/削除するロジックを作成して、再処理中にすばやく修正する必要があります。 –

2

あなたはひどいスキーマ設計をしています。カンマで区切られたリストは、DB内にビジネスを持ちません。

言われています...あなたは好きです。

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE fldInputField + '%' 

コンテンツが常に先頭に一致するとは限りません。fldInputFieldの前に別のパーセント記号を追加してください。

SELECT * FROM aTable t1 WHERE t.fldRoleList LIKE '%' + fldInputField + '%' 
+0

または、一時テーブルを作成し、通常のことをしてください。 – dkretz

+0

1を探していたら、この解決策を使って11を見つけるでしょう。 – Andomar

+0

@Andomar、いいえ。OPのサンプルデータを見てください。カンマ区切りのリストで、OPは複数の値を含むリスト内の複数の値を探しています。 '2,3,4,5,11'を含む列の '1,2,3'を検索すると '11'が一致せず、 '1'を検索している場合は一致しませんどちらか。 –

関連する問題