Sql, как оператор, чтобы получить только цифры
Это я считаю простой проблемой, но не получаю решения. Я хотел бы получить действительные числа только из столбца, как описано здесь.
Предположим, что у нас есть столбец varchar со следующими значениями
ABC
Italy
Apple
234.62
2:234:43:22
France
6435.23
2
Lions
Здесь проблема состоит в том, чтобы выбирать только числа
select * from tbl where answer like '%[0-9]%'
сделал бы это, но возвращает
234.62
2:234:43:22
6435.23
2
Здесь, очевидно, 2: 234: 43: 22 не требуется, так как это недопустимое число.
Желаемый результат:
234.62
6435.23
2
Есть ли способ сделать это?
Ответы
Ответ 1
Вы можете попробовать это
ISNUMERIC (Transact-SQL)
ISNUMERIC возвращает 1, когда вход выражение оценивается как действительное числовой тип данных; в противном случае возвращает 0.
DECLARE @Table TABLE(
Col VARCHAR(50)
)
INSERT INTO @Table SELECT 'ABC'
INSERT INTO @Table SELECT 'Italy'
INSERT INTO @Table SELECT 'Apple'
INSERT INTO @Table SELECT '234.62'
INSERT INTO @Table SELECT '2:234:43:22'
INSERT INTO @Table SELECT 'France'
INSERT INTO @Table SELECT '6435.23'
INSERT INTO @Table SELECT '2'
INSERT INTO @Table SELECT 'Lions'
SELECT *
FROM @Table
WHERE ISNUMERIC(Col) = 1
Ответ 2
Вы можете использовать следующее, чтобы включать только допустимые символы:
SQL
SELECT * FROM @Table
WHERE Col NOT LIKE '%[^0-9.]%'
Результаты
Col
---------
234.62
6435.23
2
Ответ 3
Попробуйте что-то вроде этого - оно работает для тех случаев, о которых вы упомянули.
select * from tbl
where answer like '%[0-9]%'
and answer not like '%[:]%'
and answer not like '%[A-Z]%'
Ответ 4
С SQL 2012 и более поздними версиями вы можете использовать TRY_CAST
/TRY_CONVERT
, чтобы попытаться преобразовать в числовой тип, например. TRY_CAST(answer AS float) IS NOT NULL
- обратите внимание, что это тоже будет соответствовать научной нотации (1 + E34). (Если вы используете decimal
, то научная нотация не будет соответствовать)