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

REGEXP_LIKEのCHR(0)

    CHR(0) (とりわけ)Cプログラミング言語で文字列を終了するために使用される文字です。

    CHR(0)を渡すと 次に、関数に渡して、渡した文字列を解析し、その文字列から正規表現パターンを構築する下位レベルの関数に渡します。この正規表現パターンには、CHR(0)が表示されます。 それが文字列ターミネータであると考え、残りのパターンを無視します。

    REGEXP_REPLACEを使用すると、動作がわかりやすくなります。 :

    SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
    FROM   DUAL;
    

    これを実行するとどうなりますか:

    • CHR(0) 正規表現にコンパイルされ、文字列ターミネータになります。
    • これで、パターンは単なる文字列ターミネータであるため、パターンは長さゼロの文字列になります。
    • 次に、正規表現が入力文字列と照合され、最初の文字aが読み取られます。 aの前に長さがゼロの文字列を一致させることができることを見つけます したがって、aの前に一致したものはすべて置き換えられます dを使用 出力にdaを与える 。
    • 次に、bを変換する次の文字に対して繰り返されます dbへ 。
    • 文字列の終わりに到達して長さがゼロのパターンに一致し、最後のdが追加されるまで、以下同様に続きます。 。

    そして、あなたは出力を得るでしょう:

    dadbdcd_ded
    

    ここで、_はCHR(0)です。 キャラクター。

    注:CHR(0) 入力のは置き換えられません。

    使用しているクライアントプログラムがCHR(0)でも文字列を切り捨てている場合 出力全体が表示されない場合があります(これは、クライアントが文字列を表す方法の問題であり、Oracleの出力ではありません)が、DUMP()を使用して表示することもできます。 :

    SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
    FROM DUAL;
    

    出力:

    Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
    

    [TL; DR] では、何が起こっているのか

    REGEXP_LIKE( '1234567890', CHR(0) )
    

    長さゼロの文字列正規表現パターンを作成し、1の前に長さゼロの一致を探します。 文字-それが見つけて、一致するものを見つけたことを返します。



    1. ORA-01005ODP.Netとの接続中にエラーが発生しました

    2. JAVAでjdbcTemplateのSQLクエリのタイプを判別する方法は?

    3. MySQLの情報スキーマからインデックスの方向を取得する

    4. Postgresで配列が空かどうかを確認する方法