2011-12-20 40 views
3

我运行了此查询。大多数情况下,它可以正常工作,但有几条记录中包含非数字部分,这会导致问题得不到解决。我需要能够选择只是整数的记录。获取仅为数字的记录

select distinct SUBSTRING(PAPROJNUMBER, 1, 5) AS STUDY_NUMBER 
     FROM   dbo.PA01201 AS PA01201_1 
     where PAPROJNUMBER>'0' 

例如,结果列表中的一部分是这样的:

68145 
68146 
68147 
7762A 
99999 
LABOR 

我想所有这些,除了7762A和劳动。我如何修改where子句以实现这一效率?

回答

6

将'.0e0'添加到子字符串将确保ISNUMERIC只返回有效整数。

select distinct SUBSTRING(PAPROJNUMBER, 1, 5) AS STUDY_NUMBER 
    FROM dbo.PA01201 AS PA01201_1 
    where PAPROJNUMBER>'0' 
     AND ISNUMERIC(SUBSTRING(PAPROJNUMBER, 1, 5) + '.0e0') = 1 
+0

这是要走的路。追加'.0e0'会导致十进制数字无法通过ISNUMERIC检查,因为有一个额外的小数点,并且会导致科学记数法(如浮点数)中的数字由于指数加倍而失败。因此,这优雅地排除了非整数情况,并确保您的子字符串将是一个数字整数。 – 2011-12-20 21:13:26

+2

+1 - 绕过'ISNUMERIC()' – JNK 2011-12-20 21:30:38

+1

+1中意想不到的积极方式的有效方法,但是不会仅仅'.0'就足够了吗? – 2011-12-20 23:21:37

-2

添加ISNUMERIC()到您的where子句:

select distinct SUBSTRING(PAPROJNUMBER, 1, 5) AS STUDY_NUMBER 
from DBO.PA01201 AS PA01201_1 
where PAPROJNUMBER > '0' AND ISNUMERIC(SUBSTRING(PAPROJNUMBER, 1, 5)) 

或者,你可以删除>比较:

select distinct SUBSTRING(PAPROJNUMBER, 1, 5) AS STUDY_NUMBER 
from DBO.PA01201 AS PA01201_1 
where ISNUMERIC(SUBSTRING(PAPROJNUMBER, 1, 5)) 
+1

请注意,单独使用ISNUMERIC存在问题。例如,一个空字符串'+'和'$'将全部返回1.请参阅[我的答案](http://stackoverflow.com/a/8581894/341251)以获得更安全的选择。 – 2011-12-20 21:02:52

2

你可以做以下

SELECT 
    SUBSTRING(PAPROJNUMBER, 1, 5) AS STUDY_NUMBER 
FROM dbo.PA01201 
WHERE SUBSTRING(PAPROJNUMBER, 1, 5) LIKE '[0-9][0-9][0-9][0-9][0-9]' 
+0

我想知道是否重写WHERE子句:WHERE PAPROJNUMBER LIKE'[0-9] [0-9] [0-9] [0-9] [0-9]%'' - 会使查询变为可变的。 (无论如何+1) – 2011-12-20 23:32:51