CHR(0) je znak používaný k ukončení řetězce v programovacím jazyce C (mimo jiné).
Když předáte CHR(0) funkci to zase předá funkci nižší úrovně, která analyzuje řetězce, které jste předali, a vytvoří z tohoto řetězce vzor regulárního výrazu. Tento vzor regulárního výrazu bude vidět CHR(0) a myslet si, že je to řetězec terminátor a ignorovat zbytek vzoru.
Chování je lépe vidět pomocí REGEXP_REPLACE :
SELECT REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' )
FROM DUAL;
Co se stane, když spustíte toto:
CHR(0)se zkompiluje do regulárního výrazu a stane se terminátorem řetězce.- Vzor je nyní pouze zakončením řetězce, a proto je vzorem řetězec nulové délky.
- Regulární výraz je poté porovnán se vstupním řetězcem a přečte první znak
aa najde řetězec nulové délky, který může být přiřazen předatakže nahradí nic, co se shodovalo předasddává výstupda. - Potom se bude opakovat pro další znak transformace
bnadb. - a tak dále, dokud nedosáhnete konce řetězce, kdy se bude shodovat se vzorem nulové délky a přidá poslední
d.
A dostanete výstup:
dadbdcd_ded
(kde _ je CHR(0) postava. )
Poznámka:CHR(0) ve vstupu není nahrazeno.
Pokud klientský program, který používáte, také zkracuje řetězec na CHR(0) nemusíte vidět celý výstup (toto je problém s tím, jak váš klient reprezentuje řetězec, a ne s výstupem Oracle), ale lze jej zobrazit také pomocí DUMP() :
SELECT DUMP( REGEXP_REPLACE( 'abc' || CHR(0) || 'e', CHR(0), 'd' ) )
FROM DUAL;
Výstupy:
Typ=1 Len=11: 100,97,100,98,100,99,100,0,100,101,100
[TL;DR] Co se tedy děje s
REGEXP_LIKE( '1234567890', CHR(0) )
Vytvoří vzor regulárního výrazu řetězce nulové délky a před 1 bude hledat shodu nulové délky. znak – který najde a poté vrátí, že našel shodu.