sql >> Database >  >> RDS >> Oracle

CHR(0) in REGEXP_LIKE

CHR(0) is het teken dat wordt gebruikt om een ​​string te beëindigen in de programmeertaal C (onder andere).

Wanneer u door CHR(0) komt aan de functie zal het het op zijn beurt doorgeven aan een functie op een lager niveau die de strings die je hebt doorgegeven zal ontleden en een regulier expressiepatroon van die string zal bouwen. Dit reguliere expressiepatroon ziet CHR(0) en denk dat het de stringterminator is en negeer de rest van het patroon.

Het gedrag is gemakkelijker te zien met REGEXP_REPLACE :

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

Wat gebeurt er als je dit uitvoert:

  • CHR(0) wordt gecompileerd tot een reguliere expressie en wordt een string-terminator.
  • Het patroon is nu slechts de tekenreeksterminator en dus is het patroon een tekenreeks met een lengte van nul.
  • De reguliere expressie wordt dan vergeleken met de invoerreeks en leest het eerste teken a en vindt dat een tekenreeks met lengte nul kan worden vergeleken vóór de a dus het vervangt het niets waarmee het overeenkwam vóór de a met een d het geven van de output da .
  • Het wordt dan herhaald voor het volgende teken dat b transformeert naar db .
  • enzovoort totdat je het einde van de tekenreeks bereikt, wanneer het overeenkomt met het patroon met lengte nul en een laatste d toevoegt .

En je krijgt de output:

dadbdcd_ded

(waarbij _ de CHR(0) is karakter. )

Let op:de CHR(0) in de invoer wordt niet vervangen.

Als het clientprogramma dat u gebruikt ook de tekenreeks afkapt bij CHR(0) u ziet mogelijk niet de volledige uitvoer (dit is een probleem met de manier waarop uw client de string vertegenwoordigt en niet met de uitvoer van Oracle), maar het kan ook worden weergegeven met DUMP() :

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

Uitgangen:

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

[TL;DR] Dus wat gebeurt er met

REGEXP_LIKE( '1234567890', CHR(0) )

Het maakt een regulier expressiepatroon met een tekenreeks van nul lengte en zoekt naar een overeenkomst met een lengte van nul vóór de 1 karakter - dat het zal vinden en vervolgens teruggeeft dat het een overeenkomst heeft gevonden.



  1. Alleen toetsenbordnavigatie gebruiken in Word, Excel en PowerPoint (deel 3:taakvensters)

  2. REPEAT functie equivalent in Oracle

  3. Weet hoe u een verwijderde tabel in SQL Server 2012 kunt herstellen zonder back-up

  4. hoe uren en minuten toe te voegen in curdate mysql