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

MariaDBでのREGEXP_INSTR()のしくみ

    MariaDBでは、REGEXP_INSTR() 関数は、正規表現パターンに一致する部分文字列の開始インデックスを返します。

    インデックスは1から始まります 。一致するものがない場合、結果は0になります。 。

    構文

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

    REGEXP_INSTR(subject, pattern)

    subject 入力文字列であり、pattern 部分文字列の正規表現パターンです。

    これを書いている時点では、MariaDBのバージョンのREGEXP_INSTR() MySQLのREGEXP_INSTR()よりも少ない引数を受け入れます 。 MySQLのバージョンでは、検索の開始位置、検索するオカレンス、返す位置のタイプ、および正規表現を絞り込む方法の引数を提供できます。

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

    SELECT REGEXP_INSTR('Cat', 'at');

    結果:

    +---------------------------+
    | REGEXP_INSTR('Cat', 'at') |
    +---------------------------+
    |                         2 |
    +---------------------------+

    この場合、一致があり、部分文字列は位置2から始まります。

    一致なし

    一致するものがない例を次に示します。

    SELECT REGEXP_INSTR('Cat', '^at');

    結果:

    +----------------------------+
    | REGEXP_INSTR('Cat', '^at') |
    +----------------------------+
    |                          0 |
    +----------------------------+

    一致するものがないため、結果は0になります。 。文字列は部分文字列で始まる必要があると指定したため、一致するものはありません。

    そうするように変更しましょう その部分文字列から始めます:

    SELECT REGEXP_INSTR('at', '^at');

    結果:

    +---------------------------+
    | REGEXP_INSTR('at', '^at') |
    +---------------------------+
    |                         1 |
    +---------------------------+
    

    大文字と小文字の区別

    REGEXP_INSTR() 関数は、効果的な照合の大文字と小文字の区別の規則に従います。照合は、大文字と小文字を区別しない照合では大文字と小文字を区別せずに実行され、大文字と小文字を区別する照合とバイナリデータでは大文字と小文字を区別して実行されます。

    次に例を示します:

    SELECT 
        REGEXP_INSTR('Cat', 'c') AS "My Default",
        REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_ci, 'c') AS "Case Insensitive",
        REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_cs, 'c') AS "Case Sensitive";

    結果:

    +------------+------------------+----------------+
    | My Default | Case Insensitive | Case Sensitive |
    +------------+------------------+----------------+
    |          1 |                1 |              0 |
    +------------+------------------+----------------+

    私のデフォルトの照合では大文字と小文字は区別されません。他の2つの文字列は、大文字と小文字を区別しない照合と大文字と小文字を区別する照合にそれぞれ強制されました。

    BINARYを提供する 文字列でも大文字と小文字が区別されます(以下を参照)。

    バイナリ文字列

    デフォルトでは、位置はバイトではなく文字で測定されます。ただし、マルチバイト文字セットをBINARYにキャストできます。 必要に応じて、オフセットをバイト単位で取得します。

    例:

    SELECT 
        REGEXP_INSTR('© Cat', 'C') AS "Character",
        REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";

    結果:

    +-----------+--------+
    | Character | Binary |
    +-----------+--------+
    |         3 |      4 |
    +-----------+--------+

    著作権記号は2バイトを使用するため、この例では4の結果が得られます。 BINARYにキャストする場合 、3と比較 そうでなければ得ます。

    BINARYを渡すことに注意してください 文字列は大文字と小文字の区別にも影響します。 BINARYを使用 文字列の場合、大文字は小文字とは異なります:

    SELECT 
        REGEXP_INSTR('© Cat', 'c') AS "Character",
        REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";

    結果:

    +-----------+--------+
    | Character | Binary |
    +-----------+--------+
    |         3 |      0 |
    +-----------+--------+

    ここでは、小文字のcを検索しました 大文字の代わりに、BINARY 文字列が一致しませんでした。

    ヌル引数

    nullを渡す 引数を指定するとnullになります。 :

    SELECT 
        REGEXP_INSTR(null, 'c') AS "1",
        REGEXP_INSTR('Cat', null) AS "2",
        REGEXP_INSTR(null, null) AS "3";

    結果:

    +------+------+------+
    | 1    | 2    | 3    |
    +------+------+------+
    | NULL | NULL | NULL |
    +------+------+------+

    引数の数が間違っています

    間違った数の引数を渡すか、引数を渡さないと、エラーが発生します:

    SELECT REGEXP_INSTR('Cat');

    結果:

    ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'

    1. CloudFirestoreデータベースへのデータの追加

    2. データベース対応の負荷分散:HAProxyからProxySQLに移行する方法

    3. PostgreSQLでデータエントリが自動的に削除されるまでの有効期限を設定する方法はありますか?

    4. 値を1つのフィールドから2つに分割