Oracle
 sql >> Baza danych >  >> RDS >> Oracle

CHR(0) w REGEXP_LIKE

CHR(0) jest znakiem używanym do zakończenia łańcucha w języku programowania C (między innymi).

Kiedy zdasz CHR(0) do funkcji, z kolei przekaże go do funkcji niższego poziomu, która przeanalizuje przekazane ciągi i zbuduje z nich wzorzec wyrażenia regularnego. Ten wzorzec wyrażenia regularnego zobaczy CHR(0) i pomyśl, że jest to terminator ciągu i zignoruj ​​resztę wzorca.

Zachowanie jest łatwiejsze do zauważenia dzięki REGEXP_REPLACE :

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

Co się stanie, gdy uruchomisz to:

  • CHR(0) jest kompilowany do wyrażenia regularnego i staje się terminatorem ciągu.
  • Teraz wzorzec jest tylko terminatorem ciągu, więc wzorzec jest ciągiem o zerowej długości.
  • Wyrażenie regularne jest następnie dopasowywane do ciągu wejściowego i odczytuje pierwszy znak a i stwierdza, że ​​łańcuch o zerowej długości może być dopasowany przed a więc zastępuje nic, co pasowało przed a z d dając wynik da .
  • Następnie powtórzy się dla następnego znaku przekształcającego b do db .
  • i tak dalej, aż dojdziesz do końca ciągu, kiedy będzie pasował do wzorca o zerowej długości i dołączy końcowy d .

A otrzymasz wynik:

dadbdcd_ded

(gdzie _ to CHR(0) znak. )

Uwaga:CHR(0) w wejściu nie jest zastępowany.

Jeśli program klienta, którego używasz, również obcina ciąg w CHR(0) możesz nie widzieć całych danych wyjściowych (jest to problem z tym, jak twój klient reprezentuje ciąg, a nie z danymi wyjściowymi Oracle), ale można to również wyświetlić za pomocą DUMP() :

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

Wyjścia:

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

[TL;DR] Więc co się dzieje z

REGEXP_LIKE( '1234567890', CHR(0) )

Utworzy wzorzec wyrażenia regularnego w postaci łańcucha o zerowej długości i będzie szukał dopasowania o zerowej długości przed 1 znak - który znajdzie, a następnie zwróci, że znalazł dopasowanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pętla PLSQL przez obiekt JSON

  2. Oracle SQL Połącz wiele wierszy z tym samym identyfikatorem, ale niezgodnymi identyfikatorami

  3. cx_Oracle:Jak mogę otrzymać każdy wiersz jako słownik?

  4. nie można załadować oci8 -> Błąd krytyczny:Wywołanie niezdefiniowanej funkcji oci_connect()

  5. Konwertuj datę ciągu ISO-8601 na typ danych znacznika czasu Oracle