sql >> Base de Datos >  >> RDS >> Oracle

CHR(0) en REGEXP_LIKE

CHR(0) es el carácter utilizado para terminar una cadena en el lenguaje de programación C (entre otros).

Cuando pasas CHR(0) a la función, a su vez, la pasará a una función de nivel inferior que analizará las cadenas que ha pasado y creará un patrón de expresión regular a partir de esa cadena. Este patrón de expresión regular verá CHR(0) y piense que es el terminador de cadena e ignore el resto del patrón.

El comportamiento es más fácil de ver con REGEXP_REPLACE :

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

Qué sucede cuando ejecutas esto:

  • CHR(0) se compila en una expresión regular y se convierte en un terminador de cadena.
  • Ahora el patrón es solo el terminador de la cadena, por lo que el patrón es una cadena de longitud cero.
  • La expresión regular se compara con la cadena de entrada y lee el primer carácter a y encuentra una cadena de longitud cero que puede coincidir antes de a por lo que reemplaza la nada con la que ha coincidido antes del a con una d dando la salida da .
  • Luego se repetirá para el siguiente carácter transformando b a db .
  • y así sucesivamente hasta llegar al final de la cadena, cuando coincidirá con el patrón de longitud cero y agregará una d final. .

Y obtendrá el resultado:

dadbdcd_ded

(donde _ es el CHR(0) personaje. )

Nota:el CHR(0) en la entrada no se reemplaza.

Si el programa cliente que está utilizando también está truncando la cadena en CHR(0) es posible que no vea la salida completa (este es un problema con la forma en que su cliente representa la cadena y no con la salida de Oracle), pero también se puede mostrar usando DUMP() :

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

Salidas:

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

[TL;RD] Entonces, ¿qué está pasando con

REGEXP_LIKE( '1234567890', CHR(0) )

Hará un patrón de expresión regular de cadena de longitud cero y buscará una coincidencia de longitud cero antes del 1 carácter, que encontrará y luego devolverá que ha encontrado una coincidencia.