В SQL, как я допускаю пустые значения в параметре? - PullRequest
4 голосов
/ 19 января 2010

У меня есть простой SQL-запрос, который я не могу понять, и он сводит меня с ума. Это SQL 2008. По сути, есть поле состояния, в котором можно выбрать «ожидающий», «удовлетворен» или все. Если они отправят «в ожидании» или «удовлетворены», нет проблем. Но когда они выбирают все, у меня возникают проблемы. Главным образом потому, что я не могу понять, как получить записи, где это поле является нулевым, чтобы показать (потому что оно должно быть «нулевым» вместо «= нулевым». (Это способ, которым данные будут поступать; не иметь никакого контроля над этим.)

Код, который я использовал, не работает для нулей.

ВЫБРАТЬ * FROM Payment_Table где Payment.Status_code = @ status_id

Ответы [ 8 ]

5 голосов
/ 19 января 2010

Можно попробовать

SELECT Col1, Col2,...,Coln --Required Columns
FROM Payment_Table 
where (Payment.Status_code = @status_id OR @status_id IS NULL)
2 голосов
/ 19 января 2010

Попробуйте:

SELECT * 
FROM Payment_Table 
WHERE Payment.Status_code = ISNULL(@status_id, Status_code)

Это вернет все платежи.

1 голос
/ 19 января 2010
WHERE Payment_Table.Status = ISNULL(@StatusID, Payment_Table.Status)

Обычно работает лучше, чем ИЛИ

Изменить: вы хотите выбрать строки, где Payment_Table.Status = NULL, когда @StatusID = NULL !!

SELECT * FROM Payment_Table where Payment.Status_code = @status_id
UNION ALL
SELECT * FROM Payment_Table where Payment.Status_code IS NULL AND @StatusID IS NULL

OR

...
WHERE
    Payment_Table.Status @StatusID
    OR
    (Payment.Status_code IS NULL AND @StatusID IS NULL)
1 голос
/ 19 января 2010

Попробуйте

WHERE
    ((@status_id IS NULL) OR (Payment.Status_code = @status_id)) 
0 голосов
/ 19 января 2010

Лучший способ сделать это ниже. Однако вы ДОЛЖНЫ следить за прослушиванием параметров. Это станет проблемой, когда ваша таблица станет больше и повлияет на время выполнения случайным образом. Это раздражающая проблема, которая может появиться. Используйте код ниже.

CREATE PROCEDURE GetPaymentStatus
@StatusID varchar(50)=NULL
AS
BEGIN
SET NOCOUNT ON;

DECLARE @StatusId_local varchar(50)
SET @StatusID_local = @StatusId

SELECT MyField1, MyField2
FROM Payment_Table
WHERE Payment_Table.Status=@StatusID_local 
    OR (@StatusID_local IS NULL AND Payment_Table.Status IS NULL)
END

Проверьте эту статью или Google SQL параметр, сниффинг для получения дополнительной информации.

0 голосов
/ 19 января 2010

Существует множество подходов в зависимости от того, какую версию сервера sql вы используете. Эта статья содержит подробное описание: Условия динамического поиска в T-SQL

0 голосов
/ 19 января 2010
SELECT * 
FROM Payment_Table 
WHERE (Payment.Status_code is null or Payment.Status_code = @status_id) 
0 голосов
/ 19 января 2010

Вы можете использовать coalesce или IsNull в своем поле Payment.StatusCode, это позволит вам заменить нуль на конкретное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...