Oracle
 sql >> Database >  >> RDS >> Oracle

CHR(0) in REGEXP_LIKE

CHR(0) è il carattere utilizzato per terminare una stringa nel linguaggio di programmazione C (tra gli altri).

Quando superi CHR(0) alla funzione, a sua volta, lo passerà alla funzione di livello inferiore che analizzerà le stringhe che hai passato e costruirà un modello di espressione regolare da quella stringa. Questo modello di espressione regolare vedrà CHR(0) e pensa che sia il terminatore di stringa e ignora il resto del modello.

Il comportamento è più facile da vedere con REGEXP_REPLACE :

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

Cosa succede quando esegui questo:

  • CHR(0) viene compilato in un'espressione regolare e diventa un terminatore di stringa.
  • Ora il modello è solo il terminatore di stringa e quindi il modello è una stringa di lunghezza zero.
  • L'espressione regolare viene quindi confrontata con la stringa di input e legge il primo carattere a e trova che una stringa di lunghezza zero può essere trovata prima di a quindi sostituisce il nulla che ha trovato prima di a con un d dando l'output da .
  • Si ripeterà quindi per il carattere successivo trasformando b a db .
  • e così via fino a raggiungere la fine della stringa quando corrisponderà al modello di lunghezza zero e aggiungere un d finale .

E otterrai l'output:

dadbdcd_ded

(dove _ è il CHR(0) carattere. )

Nota:il CHR(0) nell'input non viene sostituito.

Se anche il programma client che stai utilizzando tronca la stringa in CHR(0) potresti non vedere l'intero output (questo è un problema con il modo in cui il tuo client rappresenta la stringa e non con l'output di Oracle) ma può anche essere mostrato usando DUMP() :

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

Uscite:

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

[TL;DR] Allora cosa sta succedendo con

REGEXP_LIKE( '1234567890', CHR(0) )

Creerà un modello di espressione regolare di stringa di lunghezza zero e cercherà una corrispondenza di lunghezza zero prima di 1 carattere - che troverà e poi restituirà che ha trovato una corrispondenza.