Powiedzmy, że mam kolumnę tabeli, która ma wyniki takie jak:
ABC_blahblahblah
DEFGH_moreblahblahblah
IJKLMNOP_moremoremoremore
Chciałbym móc napisać zapytanie, które wybiera tę kolumnę ze wspomnianej tabeli, ale zwraca tylko podciąg do znaku podkreślenia (_). Na przykład:
ABC
DEFGH
IJKLMNOP
Funkcja SUBSTRING wydaje się nie nadawać się do tego zadania, ponieważ jest oparta na pozycji, a pozycja podkreślenia jest różna.
Myślałem o funkcji TRIM (konkretnie o funkcji RTRIM):
SELECT RTRIM('listofchars' FROM somecolumn)
FROM sometable
Ale nie jestem pewien, jak bym to działał, ponieważ wydaje się, że usuwa tylko pewną listę / zestaw znaków, a tak naprawdę jestem tylko po postaciach prowadzących do postaci Underscore.
instr
zwraca 0, jeśli maszINSTR('ABC/D', '_')
. Na końcu masz podciąg od 0 do (0-1), który jest zerowy. Niedobrze.Można to łatwo zrobić za pomocą REGEXP_SUBSTR .
Proszę użyć
gdzie STRING_EXAMPLE to Twój ciąg.
Próbować:
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
To rozwiąże twój problem.
źródło
INSTR
rozwiązanie działa prawie tak samo szybko jakREGEXP
rozwiązanie.Musisz uzyskać pozycję pierwszego podkreślenia (używając INSTR), a następnie pobrać część ciągu od pierwszego znaku do (pos-1) za pomocą substr.
1 select 'ABC_blahblahblah' test_string, 2 instr('ABC_blahblahblah','_',1,1) position_underscore, 3 substr('ABC_blahblahblah',1,instr('ABC_blahblahblah','_',1,1)-1) result 4* from dual SQL> / TEST_STRING POSITION_UNDERSCORE RES ---------------- ------------------ --- ABC_blahblahblah 4 ABC
Dokumentacja instr
Dokumentacja Susbtr
źródło
SELECT REGEXP_SUBSTR('STRING_EXAMPLE','[^_]+',1,1) from dual
to właściwa odpowiedź opublikowana przez użytkownika 1717270
Jeśli użyjesz
INSTR
, poda pozycję dla ciągu, który zakłada, że zawiera „_”. A jeśli nie? Cóż, odpowiedź będzie 0. Dlatego, jeśli chcesz wydrukować ciąg, wypisze onNULL
. Przykład: jeśli chcesz usunąć domenę z „host.domain”. W niektórych przypadkach będziesz mieć tylko krótką nazwę, np. „Host”. Najprawdopodobniej chciałbyś wydrukować „host”. Cóż, przyINSTR
jej pomocy otrzymasz znak,NULL
ponieważ nie znalazł żadnego ".", Czyli wydrukuje od 0 do 0. DziękiREGEXP_SUBSTR
temu uzyskasz poprawną odpowiedź we wszystkich przypadkach:SELECT REGEXP_SUBSTR('HOST.DOMAIN','[^.]+',1,1) from dual;
GOSPODARZ
i
SELECT REGEXP_SUBSTR('HOST','[^.]+',1,1) from dual;
GOSPODARZ
źródło
Inną możliwością byłoby użycie REGEXP_SUBSTR.
źródło
Pamiętaj o tym, jeśli wszystkie twoje ciągi w kolumnie nie mają podkreślenia (... lub inaczej, jeśli wartością wyjściową będzie wartość null):
SELECT COALESCE (SUBSTR("STRING_COLUMN" , 0, INSTR("STRING_COLUMN", '_')-1), "STRING_COLUMN") AS OUTPUT FROM DUAL
źródło
Aby znaleźć dowolny podciąg z dużego ciągu:
Następnie, aby znaleźć ciąg
'Ple'
zString_value
, możemy zrobić tak:select substr(string_value,instr(string_value,'Ple'),length('Ple')) from dual;
Znajdziesz wynik:
Ple
źródło
W przypadku, gdy pozycja łańcucha nie jest ustalona, to poniższą instrukcją Select otrzymamy oczekiwany wynik.
Identyfikator struktury tabeli VARCHAR2 (100 bajtów) CLIENT VARCHAR2 (4000 bajtów)
Identyfikator danych KLIENT
1001 {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"}
1002 {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"}
Wymaganie - Wyszukaj ciąg „ClientId” w kolumnie CLIENT i zwróć odpowiednią wartość. Na przykład From „clientId”: „con-bjp” -> con-bjp (oczekiwane wyjście)
select CLIENT, substr (substr (CLIENT, instr (CLIENT, '"clientId": "') + length ('" clientId ":"')), 1, instr (substr (CLIENT, instr (CLIENT, '"clientId") : "') + length ('" clientId ":" ')),' "', 1) -1) cut_str z TEST_SC;
KLIENT cut_str ------------------------------------------------ ----------- ---------- {"clientId": "con-bjp", "clientName": "ABC", "providerId": "SBS"} con- bjp {"IdType": "AccountNo", "Id": "XXXXXXXX3521", "ToPricingId": "XXXXXXXX3521", "clientId": "Test-Cust", "clientName": "MFX"} Test-Cust
źródło