Używam tego od jakiegoś czasu:
SUBSTRING(str_col, PATINDEX('%[^0]%', str_col), LEN(str_col))
Jednak ostatnio napotkałem problem z kolumnami zawierającymi wszystkie znaki „0”, takie jak „00000000”, ponieważ nigdy nie znaleziono znaku innego niż „0” do dopasowania.
Alternatywną techniką, którą widziałem, jest użycie TRIM
:
REPLACE(LTRIM(REPLACE(str_col, '0', ' ')), ' ', '0')
Występuje to problem, jeśli istnieją osadzone spacje, ponieważ zostaną zamienione na „0”, gdy spacje zostaną zamienione z powrotem na „0”.
Staram się uniknąć skalarnego UDF. Znalazłem wiele problemów z wydajnością związanych z funkcjami UDF w SQL Server 2005.
sql
sql-server
sql-server-2005
tsql
string
Cade Roux
źródło
źródło
Odpowiedzi:
źródło
Arvo
na SO!Dlaczego po prostu nie rzucisz wartości na,
INTEGER
a potem z powrotem doVARCHAR
?źródło
SELECT CASE ISNUMERIC(str_col) WHEN 1 THEN CAST(CAST(str_col AS BIGINT) AS VARCHAR(255)) ELSE str_col END
BIGINT
niektórymi typami łańcuchów nadal nie uda się tej konwersji. Rozważmy0001E123
na przykład.Inne odpowiedzi tutaj, aby nie brać pod uwagę, jeśli masz wszystkie zero (lub nawet jedno zero).
Niektórzy zawsze domyślnie ustawiają pusty ciąg na zero, co jest błędne, gdy ma pozostać puste.
Przeczytaj ponownie oryginalne pytanie. To odpowiada na to, czego chce Pytający.
Rozwiązanie nr 1:
Rozwiązanie nr 2 (z przykładowymi danymi):
Wyniki:
Podsumowanie:
Możesz użyć tego, co mam powyżej, do jednorazowego usunięcia wiodących zer.
Jeśli planujesz często go używać, umieść go w funkcji Inline-Table-Valued (ITVF).
Twoje obawy dotyczące problemów z wydajnością UDF są zrozumiałe.
Jednak ten problem dotyczy tylko funkcji All-Scalar i Multi-Statement-Table Functions.
Używanie ITVF jest w porządku.
Mam ten sam problem z naszą bazą danych innej firmy.
W przypadku pól alfanumerycznych wielu jest wprowadzanych bez wiodących spacji, do cholery!
To sprawia, że łączenie jest niemożliwe bez usunięcia brakujących zer wiodących.
Wniosek:
Zamiast usuwać zera wiodące, możesz rozważyć po prostu uzupełnienie przyciętych wartości zerami wiodącymi podczas łączenia.
Jeszcze lepiej, wyczyść dane w tabeli, dodając wiodące zera, a następnie odbuduj indeksy.
Myślę, że byłoby to DUŻO szybsze i mniej złożone.
źródło
Zamiast spacji zamień 0 na „rzadki” biały znak, który normalnie nie powinien znajdować się w tekście kolumny. Podawanie wiersza jest prawdopodobnie wystarczające dla takiej kolumny. Następnie możesz normalnie LTrim i ponownie zamienić znak specjalny na 0.
źródło
Poniższe polecenie zwróci „0”, jeśli ciąg składa się wyłącznie z zer:
źródło
To jest fajna funkcja ....
źródło
cast (wartość jak int) będzie zawsze działać, jeśli łańcuch jest liczbą
źródło
Moja wersja jest adaptacją pracy Arvo, z dodatkiem trochę więcej, aby zapewnić dwa inne przypadki.
1) Jeśli mamy wszystkie zera, powinniśmy zwrócić cyfrę 0.
2) Jeśli mamy spację, powinniśmy nadal zwracać pusty znak.
źródło
Sugestia Thomasa G. spełniła nasze potrzeby.
Pole w naszym przypadku było już ciągiem i trzeba było przyciąć tylko zera wiodące. Przeważnie wszystko jest numeryczne, ale czasami są litery, więc poprzednia konwersja INT się zawiesiła.
źródło
Ma to ograniczenie długości łańcucha, który można przekonwertować na INT
źródło
Jeśli używasz Snowflake SQL, możesz użyć tego:
Funkcja ltrim usuwa wszystkie instancje wyznaczonego zestawu znaków z lewej strony.
Więc ltrim (str_col, '0') on '00000008A' zwróci '8A'
A rtrim (str_col, „0.”) Na „$ 125.00” zwróci „$ 125”
źródło
Działa dobrze nawet z „0”, „00” i tak dalej.
źródło
Spróbuj tego:
źródło
Jeśli nie chcesz konwertować na int, wolę tę logikę poniżej, ponieważ może obsługiwać wartości null IFNULL (pole, LTRIM (pole, '0'))
źródło
W MySQL możesz to zrobić ...
źródło