Oracle
 sql >> Base de données >  >> RDS >> Oracle

CHR(0) dans REGEXP_LIKE

CHR(0) est le caractère utilisé pour terminer une chaîne dans le langage de programmation C (entre autres).

Lorsque vous passez CHR(0) à la fonction, il le transmettra à son tour à une fonction de niveau inférieur qui analysera les chaînes que vous avez transmises et créera un modèle d'expression régulière à partir de cette chaîne. Ce modèle d'expression régulière verra CHR(0) et pensez que c'est le terminateur de chaîne et ignorez le reste du modèle.

Le comportement est plus facile à voir avec REGEXP_REPLACE :

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

Que se passe-t-il lorsque vous exécutez ceci :

  • CHR(0) est compilé dans une expression régulière et devient un terminateur de chaîne.
  • Maintenant, le modèle n'est plus que le terminateur de chaîne et donc le modèle est une chaîne de longueur nulle.
  • L'expression régulière est ensuite comparée à la chaîne d'entrée et lit le premier caractère a et trouve qu'une chaîne de longueur nulle peut être trouvée avant le a donc il remplace le rien qu'il a trouvé avant le a avec un d donnant la sortie da .
  • Il se répétera ensuite pour le caractère suivant en transformant b à db .
  • et ainsi de suite jusqu'à ce que vous atteigniez la fin de la chaîne lorsqu'elle correspondra au modèle de longueur nulle et ajoutera un d final .

Et vous obtiendrez le résultat :

dadbdcd_ded

(où _ est le CHR(0) caractère. )

Remarque :le CHR(0) dans l'entrée n'est pas remplacé.

Si le programme client que vous utilisez tronque également la chaîne à CHR(0) vous ne pouvez pas voir la sortie entière (c'est un problème avec la façon dont votre client représente la chaîne et non avec la sortie d'Oracle) mais elle peut également être affichée en utilisant DUMP() :

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

Sorties :

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

[TL;DR] Alors que se passe-t-il avec

REGEXP_LIKE( '1234567890', CHR(0) )

Il créera un modèle d'expression régulière de chaîne de longueur nulle et recherchera une correspondance de longueur nulle avant le 1 caractère - qu'il trouvera et renverra ensuite qu'il a trouvé une correspondance.