2014-06-17 24 views
10

Chcę przyciąć ciąg do określonej długości. Jeśli ciąg jest krótszy, nie chcę nic robić. Znalazłem funkcję substr(), która wykonuje zadanie. Jednak w dokumentacji Oracle nie ma nic, co się stanie, jeśli ciąg jest krótszy, niż maksymalna długość.Używanie ciągu znaków do przycinania łańcucha na Oracle

Na przykład w ten sposób:

select substr('abc',1,5) from dual; 

zwraca 'abc', czyli to, czego potrzebuję.

Chciałbym zapytać, czy jest to bezpieczne, ponieważ funkcja ta nie jest zdefiniowana dla tego zastosowania. Czy istnieje lepszy sposób obcięcia?

+1

'SUBSTR'ing zawsze podzbiorem String. Więc nigdy nie będzie większy niż rzeczywisty ciąg. –

Odpowiedz

5

To interesujące pytanie. Zaskakująco, documentation nie wydaje się wyraźnie tego omawiać.

Myślę, że to, co robisz, jest całkiem bezpieczne. substr() nie będzie "dodawał" znaków na końcu ciągu, gdy łańcuch jest zbyt krótki. Od tego czasu polegałem na tym zachowaniu w wielu bazach danych, w tym Oracle. Tak działają podobne funkcje w innych bazach danych i większości języków.

Wyjątkiem jest sytuacja, w której pierwotnym typem danych jest typ char(), a nie varchar2(). W takim przypadku funkcja zwróci ciąg tego samego typu, więc może być wypełniony spacjami. Jest to jednak właściwość typu, który tak naprawdę nie jest funkcją.

12

Jest całkowicie w porządku, ale jeśli chcesz, możesz użyć tej kwerendy:

select substr('abc',1,least(5,length('abc'))) from dual; 
3

Lepiej wykorzystać poniższe zapytanie

SELECT SUBSTR('abc',1,LEAST(5,LENGTH('abc'))) FROM DUAL; 

Powyższe zapytanie będzie albo przyjąć długość ciąg lub liczba 5, w zależności od tego, która wartość jest niższa.

+0

Dlaczego jest lepiej? Jesteś wykonywania 2 więcej funkcji ... – Ben

+0

mi chodziło, aby być idiotoodporny i być pewny reszta bez żadnych wątpliwości! –

2

Jeśli chcesz mieć pewność, że nie skończy się ze spacjami za pomocą sam SUBSTR (nie będzie, ale czasami jest to pocieszające być pewien) można użyć:

SELECT RTRIM(SUBSTR('abc',1,5)) FROM DUAL; 

Udostępnij i ciesz się.