Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

CHR(0) em REGEXP_LIKE


CHR(0) é o caractere usado para encerrar uma string na linguagem de programação C (entre outros).

Quando você passa CHR(0) para a função, ele, por sua vez, passará para a função de nível inferior que analisará as strings que você passou e criará um padrão de expressão regular a partir dessa string. Este padrão de expressão regular verá CHR(0) e acho que é o terminador de string e ignore o resto do padrão.

O comportamento é mais fácil de ver com REGEXP_REPLACE :
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM   DUAL;

O que acontece quando você executa isso:
  • CHR(0) é compilado em uma expressão regular e se torna um terminador de string.
  • Agora, o padrão é apenas o terminador de string e, portanto, o padrão é uma string de comprimento zero.
  • A expressão regular é então comparada com a string de entrada e lê o primeiro caractere a e encontra uma string de comprimento zero que pode ser correspondida antes do a então ele substitui o nada que correspondeu antes do a com um d dando a saída da .
  • Ele será repetido para o próximo caractere transformando b para db .
  • e assim por diante até chegar ao final da string, quando ela corresponderá ao padrão de comprimento zero e anexará um d final .

E você obterá a saída:
dadbdcd_ded

(onde _ é o CHR(0) personagem. )

Nota:o CHR(0) na entrada não é substituído.

Se o programa cliente que você está usando também está truncando a string em CHR(0) você pode não ver a saída inteira (este é um problema com a forma como seu cliente está representando a string e não com a saída do Oracle), mas também pode ser mostrado usando DUMP() :
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;

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

[TL;DR] Então o que está acontecendo com
REGEXP_LIKE( '1234567890', CHR(0) )

Ele criará um padrão de expressão regular de string de comprimento zero e procurará uma correspondência de comprimento zero antes do 1 caractere - que ele encontrará e retornará que encontrou uma correspondência.