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

CHR(0) i REGEXP_LIKE

CHR(0) er det tegn, der bruges til at afslutte en streng i programmeringssproget C (blandt andre).

Når du sender CHR(0) til funktionen vil den til gengæld videregive den til en funktion på et lavere niveau, der vil analysere de strenge, du har sendt i, og bygge et regulært udtryksmønster ud fra den streng. Dette regulære udtryksmønster vil se CHR(0) og tror det er strengterminatoren og ignorer resten af ​​mønsteret.

Opførselen er lettere at se med REGEXP_REPLACE :

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

Hvad sker der, når du kører dette:

  • CHR(0) kompileres til et regulært udtryk og bliver til en strengterminator.
  • Nu er mønsteret kun strengterminatoren, og mønsteret er derfor en nullængde streng.
  • Det regulære udtryk matches derefter mod inputstrengen, og det læser det første tegn a og finder en nul-længde streng kan matches før a så det erstatter intet, det har matchet før a med en d giver outputtet da .
  • Den gentages derefter for det næste tegn, der transformerer b til db .
  • og så videre, indtil du når slutningen af ​​strengen, når den matcher nullængdemønsteret og tilføjer en sidste d .

Og du får outputtet:

dadbdcd_ded

(hvor _ er CHR(0) tegn. )

Bemærk:CHR(0) i input er ikke erstattet.

Hvis det klientprogram, du bruger, også trunkerer strengen ved CHR(0) du kan muligvis ikke se hele outputtet (dette er et problem med, hvordan din klient repræsenterer strengen og ikke med Oracles output), men det kan også vises ved hjælp af DUMP() :

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

Udgange:

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

[TL;DR] Så hvad sker der med

REGEXP_LIKE( '1234567890', CHR(0) )

Det vil lave et regulært udtryksmønster med nul-længde streng, og det vil lede efter et match med nul-længde før 1 tegn - som den vil finde og så returnere, at den har fundet et match.



  1. Optimizer i Oracle Database 19c

  2. ORACLE - ORA-01843:ikke en gyldig måned

  3. Få en MySQL-gruppe efter forespørgsel til at vise rækken i den gruppe med den højeste værdi

  4. Sag i Select Statement