MySQL find_in_set()関数

5732 ワード

MySQL findから転載in_set()関数
MySQL FIND_IN_SET関数の概要
MySQLには、カンマで区切られた文字列のリストで指定された文字列の場所を検索できるFIND_IN_SET()という内蔵文字列関数が用意されています.FIND_IN_SET()関数の構文を説明します.
FIND_IN_SET(needle,haystack);
FIND_IN_SET()関数は、2つのパラメータを受け入れます.
  • の最初のパラメータneedleは、検索する文字列です.
  • の2番目のパラメータhaystackは、検索するカンマで区切られた文字列のリストです.
  • FIND_IN_SET()関数は、パラメータの値に基づいて整数またはNULLの値を返します.
  • needleまたはhaystackNULLである場合、関数はNULLの値を返します.
  • needlehaystackにない場合、またはhaystackが空の文字列である場合、ゼロが返されます.
  • needlehaystackの場合、正の整数が返されます.
  • needleにカンマ()が含まれている場合、この関数は正常に動作しません.さらに、needleが定数文字列であり、haystackSETのタイプの列である場合、MySQLはビット算術最適化を使用します.
    MySQL FIND_IN_SET例
    次に、MySQL FIND_IN_SETの動作原理を理解し、学習する例を挙げます.
    MySQL FIND_IN_SET:簡単な例
    次の文は、文字2'y'文字列の2番目の位置であるため、'x,y,z'を返します.
    mysql> SELECT FIND_IN_SET('y','x,y,z');
    +--------------------------+
    | FIND_IN_SET('y','x,y,z') |
    +--------------------------+
    |                        2 |
    +--------------------------+
    1 row in set
    

    次の文は、0'a'文字列リストにないため、'x,y,z'を返します.
    mysql> SELECT FIND_IN_SET('a','x,y,z');
    +--------------------------+
    | FIND_IN_SET('a','x,y,z') |
    +--------------------------+
    |                        0 |
    +--------------------------+
    1 row in set
    

    次の文は、2番目のパラメータが空の文字列であるため、0も返します.
    mysql> SELECT FIND_IN_SET('a','');
    +---------------------+
    | FIND_IN_SET('a','') |
    +---------------------+
    |                   0 |
    +---------------------+
    1 row in set
    

    次の文は、最初のパラメータがNULLであるため、NULLを返します.
    SELECT FIND_IN_SET(NULL,'x,y,z');
    

    2番目のパラメータがNULLであるため、次の文もNULLを返します.
    mysql> SELECT FIND_IN_SET('a',NULL);
    +-----------------------+
    | FIND_IN_SET('a',NULL) |
    +-----------------------+
    | NULL                  |
    +-----------------------+
    1 row in set
    

     
    MySQL FIND_IN_SET:テーブルからのデータ照会例
    プレゼンテーションの目的で、divisionsという新しいテーブルが作成されます.
    まず、次の文を使用してdivisionsテーブルを作成します.
    USE testdb;
    CREATE TABLE IF NOT EXISTS divisions (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(25) NOT NULL,
        belts VARCHAR(200) NOT NULL
    );
    

    SQL
    次に、divisionsテーブルに数行のデータを挿入します.
    INSERT INTO divisions(name,belts)
    VALUES ('O-1','white,yellow,orange'),
     ('O-2','purple,green,blue'),
     ('O-3','brown,red,black'),
     ('O-4','white,yellow,orange'),
     ('O-5','purple,green,blue'),
     ('O-6','brown,red'),
     ('O-7','black'),
     ('O-8','white,yellow,orange'),
     ('O-9','purple,green,blue'),
     ('O-10','brown,red');
    

    第三に、井戸の底にredベルトを受け入れる部門は、FIND_IN_SET関数を使用して、以下のようにすることができる.
    SELECT 
        name, belts
    FROM
        divisions
    WHERE
        FIND_IN_SET('red', belts);
    

    上記のクエリ文を実行すると、次の結果が得られます.
    +------+-----------------+
    | name | belts           |
    +------+-----------------+
    | O-3  | brown,red,black |
    | O-6  | brown,red       |
    | O-10 | brown,red       |
    +------+-----------------+
    3 rows in set
    

     
    MySQL NOT FIND_IN_SET例FIND_IN_SET()関数は、2番目のパラメータで1番目のパラメータが見つからない場合に0を返すためです.したがって、NOT演算子を使用して、FIND_IN_SET()関数が返す結果値を否定できます.
    たとえば、黒い(black)ベルトを受け入れない部門を見つけるには、次の文を使用します.
    SELECT 
        name, belts
    FROM
        divisions
    WHERE
        NOT FIND_IN_SET('black', belts);
    

    上記の文を実行して、次の結果を得ます.
    +------+---------------------+
    | name | belts               |
    +------+---------------------+
    | O-1  | white,yellow,orange |
    | O-2  | purple,green,blue   |
    | O-4  | white,yellow,orange |
    | O-5  | purple,green,blue   |
    | O-6  | brown,red           |
    | O-8  | white,yellow,orange |
    | O-9  | purple,green,blue   |
    | O-10 | brown,red           |
    +------+---------------------+
    8 rows in set
    

     
    MySQL FIND_IN_SET関数とIN演算子
    IN演算子は、値が指定値リストに一致するかどうかを決定します.たとえば、O-1またはO-2という名前の部門を検索するには、次のようにIN演算子を使用します.
    SELECT 
        name, belts
    FROM
        divisions
    WHERE
        name IN ('O-1' , 'O-2');
    

    上記のクエリ文を実行すると、次の結果が得られます.
    +------+---------------------+
    | name | belts               |
    +------+---------------------+
    | O-1  | white,yellow,orange |
    | O-2  | purple,green,blue   |
    +------+---------------------+
    2 rows in set
    
    FIND_IN_SET関数を使用して、上記のクエリと同じ結果を得ることができます.
    SELECT 
        name, belts
    FROM
        divisions
    WHERE
        FIND_IN_SET(name, 'O-1,O-2');
    

    したがって、column IN (x, y, z)式はFIND_IN_SET(column, 'x,y,z')式と同じである.IN演算子は、カンマで区切られた任意の数のパラメータを受け入れることができます.しかし、FIND_IN_SET関数には2つのパラメータしかありません.
    値をデータベースの値リストと一致させるには、IN演算子を使用します.また、FIND_IN_SET関数は、データベースにカンマで区切られて格納されている値リストと値を一致させる場合に使用できます.
    このチュートリアルでは、FIND_IN_SET関数を使用して、カンマで区切られた文字列リストの文字列を検索する方法について学習しました.