2011-12-20 69 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