sql like运算符只能获取数字

时间:2010-01-09 07:51:10

标签: sql sql-server numbers

这是一个简单的问题,但还没有得到解决方案。我想从这里解释的列中获取有效数字。

假设我们有一个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

有办法做到这一点吗?

5 个答案:

答案 0 :(得分:38)

您可以使用以下内容仅包含有效字符:

<强> SQL

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

<强>结果

Col
---------
234.62
6435.23
2

答案 1 :(得分:21)

你可以试试这个

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 :(得分:10)

尝试这样的事情 - 它适用于您提到的案例。

select * from tbl
where answer like '%[0-9]%'
and answer not like '%[:]%'
and answer not like '%[A-Z]%'

答案 3 :(得分:1)

使用SQL 2012及更高版本,您可以使用TRY_CAST / TRY_CONVERT尝试转换为数字类型,例如TRY_CAST(answer AS float) IS NOT NULL - 请注意,这也符合科学记数法(1 + E34)。 (如果您使用decimal,则科学记数法不会匹配)

答案 4 :(得分:0)

在简单的SQL92中,什么可以使您到达所需的位置:

select * from tbl where lower(answer) = upper(answer)

或者,如果您还想对开头/结尾空格保持健壮:

select * from tbl where lower(answer) = trim(upper(answer))