Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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, то научная нотация не будет соответствовать)