I am trying to check if a string
contains only valid number in the following format
123.456 123 .356
But it should reject anything that contains non-numbers including double dots. Here are some invalid formats
d123.456 123d 12d3 d.1256 12d.456 12.d12 12.d45d 12.45.56
I have done the following
SELECT CASE WHEN '123.00' NOT LIKE '%[^0-9.]%' THEN 'Valid' ELSE 'Invalid' END
When seems to work except for the case where there is more than one dot in the string.
How can I tweak the regular expression to only allow one dot otherwise return ‘Invalid’?
Advertisement
Answer
I would suggest try_convert()
:
select (case when try_convert(col, float) is not null then 'valid' else 'invalid' end)
The one possible downside is exponential format; 1e6
is a valid number for instance.
An alternative is the where
approach; you just need more complete logic:
select (case when col like '%[^0-9.]%' then 'invalid' when col like '%.%.%' then 'invalid' else 'valid' end)