Это немного сложнее, потому что вы не хотите, чтобы получить конверсию ошибка. Ниже следует управлять этим:
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)
второй проще:
select *
from set2
where col like '%[.][0-9][0-9]%
Конверсии строк с номерами - без ошибок - это хлопотно в SQL Server. Практически во всех случаях вы не имеете представления о порядке операций. Таким образом, следующее часто генерирует ошибку:
select s.*, cast(col as number)
from set1
where isnumeric(col);
потому что cast()
может быть обработан до того isnumeric()
. Оператор , который контролирует порядок обработки, составляет case
, поэтому первая версия использует case
в предложении where
. Примечание: подзапросы и CTE не влияют на порядок.
SQL Server 2012+ предлагает функцию try_convert()
, которая облегчает обработку ошибок в конверсиях.
Какие СУБД вы используете? – Mureinik
SQL SERVER 2008 – akhrot
@akhrot проверить мой ответ, он должен работать на вас. –