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

Jaký je rozdíl mezi (*) a .* v regulárním výrazu?

Zdá se, že v Oracle 11 je * a + vzory (bez předchozího) generují shody s nulovou šířkou. Takže (*) a (+) zachycují skupiny () obsahující vzory s nulovou šířkou * nebo + respektive.

Všechny tyto dotazy vrátí řádek:

SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '*' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '(*)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^*' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^(*)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '*1' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '+' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '(+)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^(+)' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '+1' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+1' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '+1$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+1$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '()' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '1(*)2' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '1(+)2' );

Tyto dotazy nevrací žádné řádky:

SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '*2' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^*$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', '^+$' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '11(*)2' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '12', '11(+)2' );

Také porovnání jakéhokoli vzoru s NULL nebo řetězec proti NULL vzor nevrátí žádné řádky:

SELECT * FROM DUAL WHERE REGEXP_LIKE( NULL, '*' );
SELECT * FROM DUAL WHERE REGEXP_LIKE( '1', NULL );

Pomocí REGEXP_SUBSTR :

SELECT REGEXP_SUBSTR( '1', '+' ) FROM DUAL;

Vypíše jeden řádek obsahující NULL .



  1. Oracle:Jak zjistit ukončení klientského procesu, jako to funguje pro sqlplus?

  2. NULL v MySQL (výkon a úložiště)

  3. Hašování nebo šifrování proměnných, které mají být odeslány v adrese URL

  4. Běžný způsob porovnání časových razítek v Oracle, PostgreSQL a SQL Server