sql >> Databáze >  >> RDS >> Oracle

CHR(0) v REGEXP_LIKE

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 a a najde řetězec nulové délky, který může být přiřazen před a takže nahradí nic, co se shodovalo před a s d dává výstup da .
  • Potom se bude opakovat pro další znak transformace b na db .
  • 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.



  1. Přesun na mysqli, mysql_result

  2. SQL AS:Použití, příklady a jak vám může nejlépe prospět

  3. změnit sloupec přejmenování tabulky v databázi Oracle

  4. Formulář PHP vrací Upozornění:Převod pole na řetězec