sql >> データベース >  >> RDS >> Mysql

MySQLでのMAKE_SET()関数のしくみ

    MySQLでは、MAKE_SET() 関数は設定値(,で区切られた部分文字列を含む文字列)を返します 文字)関数を呼び出すときに引数として指定された文字で構成されます。

    関数を呼び出すときは、任意の数の文字列(コンマで区切る)と、設定値で返す文字列を決定する1つ以上のビット値を指定します。

    構文

    構文は次のようになります:

    MAKE_SET(bits,str1,str2,...)
    

    基本的な例は次のとおりです。

    SELECT MAKE_SET(1, 'a','b','c','d') Result;

    結果:

    +--------+
    | Result |
    +--------+
    | a      |
    +--------+
    

    この結果は、最初は明白に思えるかもしれません。結局のところ、最初の引数は1です。 、および関数は最初の文字列を返します。

    ただし、それは完全には機能しません。

    別の例を示します。

    SELECT MAKE_SET(4, 'a','b','c','d') Result;

    結果:

    +--------+
    | Result |
    +--------+
    | c      |
    +--------+
    

    4を指定したにもかかわらず、3番目の文字列が返されたことに注意してください。 最初の議論として?

    これは、MAKE_SET()が原因です。 関数はバイナリ表現を使用します 後続の引数で該当する文字列を返す最初の引数の。

    次のコード例を見て、私が何を意味するかを確認してください。

    SELECT 
      BIN(1) AS '1',
      BIN(2) AS '2',
      BIN(3) AS '3',
      BIN(4) AS '4',
      BIN(5) AS '5',
      BIN(6) AS '6',
      BIN(7) AS '7',
      BIN(8) AS '8',
      BIN(9) AS '9',
      BIN(10) AS '10';

    結果:

    +------+------+------+------+------+------+------+------+------+------+
    | 1    | 2    | 3    | 4    | 5    | 6    | 7    | 8    | 9    | 10   |
    +------+------+------+------+------+------+------+------+------+------+
    | 1    | 10   | 11   | 100  | 101  | 110  | 111  | 1000 | 1001 | 1010 |
    +------+------+------+------+------+------+------+------+------+------+
    

    ここでは、BIN()を使用します 各数値のバイナリ値を返す関数。

    4のバイナリ表現であることがわかります 100です 。 MAKE_SET()に適用するには、これを逆方向に視覚化する必要があります。 上記の例。この場合、これは3桁のバイナリ値であり、右端の桁が最初の文字列に対応し、次の桁が2番目の文字列に対応し、左端の桁が3番目の文字列に対応します。

    バイナリ用語では、1 は「オン」で0 「オフ」です。 MAKE_SET() 関数は、対応する1を持つ文字列のみを返します バイナリ値で。したがって、上記の例では3番目の文字列が返されます。

    別の値を使用した別の例を次に示します。

    SELECT MAKE_SET(10, 'a','b','c','d') Result;

    結果:

    +--------+
    | Result |
    +--------+
    | b,d    |
    +--------+
    

    この場合、バイナリ値は1010です。 。したがって、2つの1があります s、2番目と4番目の文字列引数に対応します。

    概念をさらに実証するためのいくつかの例を次に示します。

    SELECT 
      MAKE_SET(1, 'a','b','c','d') AS '1',
      MAKE_SET(2, 'a','b','c','d') AS '2',
      MAKE_SET(3, 'a','b','c','d') AS '3',
      MAKE_SET(4, 'a','b','c','d') AS '4',
      MAKE_SET(5, 'a','b','c','d') AS '5',
      MAKE_SET(6, 'a','b','c','d') AS '6',
      MAKE_SET(7, 'a','b','c','d') AS '7',
      MAKE_SET(8, 'a','b','c','d') AS '8',
      MAKE_SET(9, 'a','b','c','d') AS '9',
      MAKE_SET(10, 'a','b','c','d') AS '10';

    結果:

    +---+---+-----+---+-----+-----+-------+---+-----+-----+
    | 1 | 2 | 3   | 4 | 5   | 6   | 7     | 8 | 9   | 10  |
    +---+---+-----+---+-----+-----+-------+---+-----+-----+
    | a | b | a,b | c | a,c | b,c | a,b,c | d | a,d | b,d |
    +---+---+-----+---+-----+-----+-------+---+-----+-----+
    

    また、別の文字列セットを使用した例を次に示します。

    SELECT MAKE_SET(5, 'Cat','Dog','Horse','Duck') Result;

    結果:

    +-----------+
    | Result    |
    +-----------+
    | Cat,Horse |
    +-----------+
    

    複数のバイナリ値

    最初の引数で複数のバイナリ値を渡すためにパイプを使用できます:

    SELECT MAKE_SET(1 | 4, 'a','b','c','d') Result;

    結果:

    +--------+
    | Result |
    +--------+
    | a,c    |
    +--------+
    

    最初の引数のバイナリ値を逆にした場合も同じ結果が得られることに注意してください:

    SELECT MAKE_SET(4 | 1, 'a','b','c','d') Result;

    結果:

    +--------+
    | Result |
    +--------+
    | a,c    |
    +--------+
    

    NULL値

    NULL値の文字列は、結果に追加されません。

    例:

    SELECT MAKE_SET(1 | 4, 'a','b',NULL,'d') Result;

    結果:

    +--------+
    | Result |
    +--------+
    | a      |
    +--------+
    


    1. SQL:フルネームフィールドから名、ミドルネーム、ラストネームを解析します

    2. ネストされたトランザクションはMySQLで許可されていますか?

    3. トレースフラグ3226を使用してログバックアップログを抑制します

    4. AzureSQLデータベースの帯域幅に適したクエリプロファイリング