2011-12-20 3 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, потому что есть дополнительная десятичная точка, и приводит к сбою номеров в научной нотации (например, с плавающей запятой) из-за удвоенного показателя. Следовательно, это элегантно исключает нецелые случаи и гарантирует, что ваша подстрока будет числовым целым числом. –

+2

+1 - Эффективный способ обойти неожиданные срабатывания в 'ISNUMERIC()' – JNK

+1

+1, но не хватит ли просто '.0'? –

-2

Добавить 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)) 

В качестве альтернативы, вы можете отказаться от > сравнения:

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) для более безопасной альтернативы. –

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 в любом случае) –

Смежные вопросы