Oracle
 sql >> база данни >  >> RDS >> Oracle

CHR(0) в REGEXP_LIKE

CHR(0) е знакът, използван за завършване на низ в езика за програмиране C (наред с други).

Когато преминете CHR(0) към функцията, той от своя страна ще го предаде на функция от по-ниско ниво, която ще анализира низовете, които сте предали, и ще изгради модел на регулярен израз от този низ. Този модел на регулярен израз ще види CHR(0) и си помислете, че това е терминаторът на низ и игнорирайте останалата част от шаблона.

Поведението се вижда по-лесно с REGEXP_REPLACE :

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

Какво се случва, когато стартирате това:

  • CHR(0) се компилира в регулярен израз и става терминатор на низ.
  • Сега шаблонът е просто терминатор на низ и така шаблонът е низ с нулева дължина.
  • След това регулярният израз се съпоставя с въведения низ и той чете първия знак a и намира, че низ с нулева дължина може да бъде съпоставен преди a така че замества нищото, което е съпоставило преди a с d дава изхода da .
  • След това ще се повтори за следващия символ, трансформиращ b към db .
  • и така нататък, докато стигнете до края на низа, когато той ще съответства на модела с нулева дължина и ще добави крайно d .

И ще получите резултата:

dadbdcd_ded

(където _ е CHR(0) характер. )

Забележка:CHR(0) във входа не се заменя.

Ако клиентската програма, която използвате, също съкращава низа в CHR(0) може да не видите целия изход (това е проблем с начина, по който вашият клиент представя низа, а не с изхода на Oracle), но той може също да бъде показан чрез DUMP() :

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

Изходи:

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

[TL;DR] И така, какво се случва с

REGEXP_LIKE( '1234567890', CHR(0) )

Той ще създаде шаблон за регулярен израз на низ с нулева дължина и ще търси съвпадение с нулева дължина преди 1 символ - който ще намери и след това ще върне, че е намерил съвпадение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да избера всички колони от таблица, плюс допълнителни колони като ROWNUM?

  2. Предоставя ли Oracle начин за връщане на множество поднизове от ред на низ/clob, който е анализиран?

  3. Не може да стартира IntelliJ IDEA CE 12 с Ubuntu Oracle Java 8

  4. Как да промените таблицата в Oracle

  5. В Oracle възможно ли е да се ВМЕСНА или АКТУАЛИЗИРА запис чрез изглед?