To jest trochę skomplikowane, ponieważ nie chcesz, aby uzyskać konwersję błąd. Poniższy powinna zarządzać tym:
select *
from set1
where 1 = (case when col = '' then 1
when col like '+[0-9][0-9[0-9]%' and isnumeric(col, left(5))
(case when cast(left(col, 5)) > 125 then 1 end)
when col like '+[0-9][0-9[0-9]%' and isnumeric(col, left(4))
(case when cast(left(col, 4)) > 125 then 1 end)
end)
Drugi jest łatwiejsze:
select *
from set2
where col like '%[.][0-9][0-9]%
konwersje ciągów liczb - bez błędu - to kłopotliwe w SQL Server. W prawie wszystkich przypadkach nie masz pojęcia o kolejności operacji. Więc, co następuje często generuje błąd:
select s.*, cast(col as number)
from set1
where isnumeric(col);
ponieważ cast()
mogą być przetwarzane przedisnumeric()
. Instrukcja, która kontroluje kolejność przetwarzania, to case
, dlatego też pierwsza wersja zawiera w klauzuli w klauzuli where
. Uwaga: podzapytania i CTE nie wpływają na kolejność.
SQL Server 2012+ oferuje funkcję try_convert()
, która ułatwia przetwarzanie błędów w konwersjach.
Z jakiego RDBMS korzystasz? – Mureinik
SQL SERVER 2008 – akhrot
@akhrot sprawdź moją odpowiedź, to powinno działać dla ciebie. –