mysqlでFIND_IN_SET関数の使い方

2595 ワード

この記事では主にmysqlのFINDを紹介します.IN_SET関数は、フィールド内のカンマで区切られたデータを正確に検索するために使用されます.
likeとinとの違い
1.問題発見
以前は、インタフェースから送信されたサービス業者番号と開通した製品タイプで、このテーブルにこの情報があるかどうかを問い合わせる必要がありました.
しかし、会社の製品タイプは複数あり、各サービス業者は複数の異なる製品タイプを開通している可能性があります.製品タイプを格納する際に使用されるフィールドは、カンマで区切られて格納されます.
このシーンでは製品のタイプを正確に調べる必要があります.最初はinとlikeで実現しようと思っていましたが、実際に使ってみるとこのような効果はありませんでした.以下の説明を見てください.
2.問題解決
in実装の使用
sql文は次のとおりです.
SELECT
    agentNum
FROM
    p4_agent_limit_merc_access a
WHERE
    agentNum = #{agentNum} (        )
AND #{productType} (       )
IN(a.productType);

しかし、実際には、このように書くとデータが調べられず、a.productTypeフィールドの値が入力された製品タイプに等しい場合(INの前の文字列と完全に一致する場合)にのみクエリーが有効になります.そうしないと、a.productTypeに入力された製品タイプが含まれていても、結果は調べられません.
likeを使用して実装
sql文は次のとおりです.
SELECT
    agentNum
FROM
    p4_agent_limit_merc_access a
WHERE
    agentNum = #{agentNum} 
AND  a.productType
LIKE concat('%',#{productType}, '%');

表面はこのように書くのは問題ないように見えますが、細かく見ると、問題が大きいことがわかります.likeは広範なあいまいなクエリーですが、文字列にあなたが入力する値が含まれている場合も、私たちの製品タイプproductTypeにはQPSOSとPOSがありますが、今回検索したサービス業者はQPSOS製品しか開通していません.私はPOSというタイプに入りました.上記の文で検索してもこの結果が検出されます.これが問題です.だからlikeで検索する範囲はもっと広くなります.これは明らかに不合理で、私たちが望んでいる結果ではありません.
FIND_を使うIN_SET関数実装
まずはFIND_をご紹介しますIN_SET関数:
FIND_IN_SET(str,strlist)
strクエリーする文字列
strlistフィールド名パラメータは、(1,2,6,8)のように区切られます.
クエリーフィールド(strlist)に(str)が含まれている結果.nullまたはレコードの結果が返されます.
文字列strがN個のサブチェーンからなる文字列リストstrlistにある場合、戻り値の範囲は1〜Nである.1つの文字列リストは、「,」記号で区切られたいくつかのサブチェーンからなる文字列です.最初のパラメータが定数文字列で、2番目がtype SET列の場合、FIND_IN_SET()関数を最適化し,ビット計算を用いた.strがstrlistまたはstrlistで空の文字列でない場合、戻り値は0です.いずれかのパラメータがNULLの場合、NULLが返されます.この関数は、最初のパラメータにカンマ(',')が含まれている場合に正常に動作しません.
紹介は簡単に理解すればいいですが、具体的にはどのように使うかを見て、私のsqlは以下の通りです.
SELECT
    agentNum
FROM
    p4_agent_limit_merc_access a
WHERE
    agentNum = #{agentNum} 
AND FIND_IN_SET(#{productType},a.productType);

上記の文を使用すると、データを正確にクエリーし、ニーズを実現できます.
FINDを見てみましょうIN_SET関数の具体的な使用例:
SELECT FIND_IN_SET('b', 'a,b,c,d');   2

bはstrlist集合の中で2の位置に置いて1から始まるので
select FIND_IN_SET('1', '1'); 戻りが1の場合のstrlist集合はちょっと特殊ですが、1つの文字列だけは、前の文字列が必ず後の文字列集合で0より大きい数を返すように要求されています.
select FIND_IN_SET('2', '1,2');   2
select FIND_IN_SET('6', '1');   0

3.まとめ
a.productTypeフィールドが定数である場合、inで実現することができる.
変数の場合はFIND_を使用する必要があります.IN_SET関数で実現しました.
 もっと素晴らしい機能は私の個人ブログのウェブサイトに注目してください.https://liujian.cool
私の個人の公衆番号に注目することを歓迎します:プログラム猿劉川楓