To dlatego, że --
jest częścią -->
separator, ale nie jest częścią ->
separator.
Nawet jeśli wartość danych zawiera -->
to zapytanie nie powinno być błędne. Jak poniżej.
SQL> select Sys_Connect_By_Path('SomeText B-->More Text' || ':' || 'SomeText A-->More Text', ' --> ') "myNewVar"
from dual
connect by rownum<=3;
myNewVar
----------------------------------------------------
--> SomeText B-->More Text:SomeText A-->More Text
--> SomeText B-->More Text:SomeText A-->More Text --> SomeText B-->More Text:SomeText A-->More Text
--> SomeText B-->More Text:SomeText A-->More Text --> SomeText B-->More Text:SomeText A-->More Text --> SomeText B-->More Text:SomeText A-->More Text
Separator powyżej to -->
, zwróć uwagę na spację. Ta spacja jest uważana za część separatora, tj. chr(1)||chr(45)||chr(45)||chr(62)||chr(1)
. Cały ten ciąg nie jest częścią Twoich danych ani wartości kolumny.
Gdzie, jak poniżej, wystąpiłby błąd
SQL> select Sys_Connect_By_Path('SomeText B-->More Text' || ':' || 'SomeText A-->More Text', '-->') "myNewVar"
from dual
connect by rownum<=3;
ORA-30004: when using SYS_CONNECT_BY_PATH function, cannot have seperator as part of column value
30004. 00000 - "when using SYS_CONNECT_BY_PATH function, cannot have seperator as part of column value"
*Cause:
*Action: Use another seperator which does not occur in any column value,
then retry.
Separator powyżej to -->
, zauważ, że nie ma białych znaków, tj. chr(45)||chr(45)||chr(62)
. Cały ten ciąg jest rzeczywiście częścią Twoich danych lub wartości kolumny, a zatem jest to błąd.
A oto rozwiązanie (wydajność nieprzetestowana)
select regexp_replace(Sys_Connect_By_Path('SomeText B-->More Text' || ':' || 'SomeText A-->More Text', ' -> '),' -> ','-->') "myNewVar"
from dual
connect by rownum<=3;
myNewVar
--------------------------------------
-->SomeText B-->More Text:SomeText A-->More Text
-->SomeText B-->More Text:SomeText A-->More Text-->SomeText B-->More Text:SomeText A-->More Text
-->SomeText B-->More Text:SomeText A-->More Text-->SomeText B-->More Text:SomeText A-->More Text-->SomeText B-->More Text:SomeText A-->More Text
Wyjaśnienie - Tutaj (w powyższym zapytaniu) ->
(ze spacją) nie jest częścią danych tutaj, tj. -->
. Po połączeniu kolumny ścieżką regexp_replace
zastępuje wszystkie wystąpienia ->
z --> więc w ten sposób nadal będziesz mieć
-->
jako separator zamiast ->
.