SQL как оператор, чтобы получить только цифры - PullRequest
24 голосов
/ 09 января 2010

Я думаю, что это простая проблема, но пока не найдено ее решение. Я хотел бы получить действительные числа только из столбца, как описано здесь.

Допустим, у нас есть столбец 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

Есть ли способ сделать это?

Ответы [ 4 ]

39 голосов
/ 09 января 2010

Вы можете использовать следующее, чтобы включать только допустимые символы:

SQL

SELECT * FROM @Table
WHERE Col NOT LIKE '%[^0-9.]%'

Результаты

Col
---------
234.62
6435.23
2
22 голосов
/ 09 января 2010

Вы можете попробовать это

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
10 голосов
/ 09 января 2010

Попробуйте что-то вроде этого - это работает для случаев, которые вы упомянули.

select * from tbl
where answer like '%[0-9]%'
and answer not like '%[:]%'
and answer not like '%[A-Z]%'
1 голос
/ 31 октября 2017

В SQL 2012 и более поздних версиях вы можете использовать TRY_CAST / TRY_CONVERT, чтобы попытаться преобразовать в числовой тип, например TRY_CAST(answer AS float) IS NOT NULL - обратите внимание, что это также будет соответствовать научным обозначениям (1 + E34). (Если вы используете decimal, то научная запись не будет соответствовать)

...