这是一个简单的问题,但还没有得到解决方案。我想从这里解释的列中获取有效数字。
假设我们有一个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
有办法做到这一点吗?
答案 0 :(得分:38)
您可以使用以下内容仅包含有效字符:
<强> SQL 强>
SELECT * FROM @Table
WHERE Col NOT LIKE '%[^0-9.]%'
<强>结果
Col
---------
234.62
6435.23
2
答案 1 :(得分:21)
你可以试试这个
输入时,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))