在SQL中,如何在参数中允许空值?

时间:2010-01-19 19:19:14

标签: sql sql-server tsql sql-server-2008 null

我有一个看起来很简单的SQL查询,我无法弄明白,它让我疯狂。这是SQL 2008.基本上,有一个状态字段,可以选择“挂起”,“满意”或全部。如果他们发送“待定”或“满意”,则没有问题。但当他们选择所有我遇到问题时。主要是因为我无法弄清楚如何获取此字段为空的记录(因为它必须是'is null'而不是'= null'。(这是数据将来的方式;我无法控制。)

我一直在使用的代码不适用于空值。

SELECT * 来自Payment_Table 其中Payment.Status_code = @status_id

8 个答案:

答案 0 :(得分:5)

你可以尝试

SELECT Col1, Col2,...,Coln --Required Columns
FROM Payment_Table 
where (Payment.Status_code = @status_id OR @status_id IS NULL)

答案 1 :(得分:2)

尝试:

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

这将返回所有付款。

答案 2 :(得分:1)

尝试

WHERE
    ((@status_id IS NULL) OR (Payment.Status_code = @status_id)) 

答案 3 :(得分:1)

WHERE Payment_Table.Status = ISNULL(@StatusID, Payment_Table.Status)

通常是works better then OR

编辑:当@StatusID = NULL时,你想选择Payment_Table.Status = 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)

答案 4 :(得分:0)

您可以在Payment.StatusCode字段上使用coalesce或IsNull,这样您就可以用特定值替换null。

答案 5 :(得分:0)

SELECT * 
FROM Payment_Table 
WHERE (Payment.Status_code is null or Payment.Status_code = @status_id) 

答案 6 :(得分:0)

根据您使用的sql server版本,有很多方法。本文有一个深入的描述:Dynamic Search Conditions in T-SQL

答案 7 :(得分:-1)

最好的方法是在下面。但是,你必须注意参数嗅探。这将成为一个问题,因为您的表变大,会随机影响您的执行时间。这是一个令人烦恼的问题,可以弹出。请使用以下代码。

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

查看此article或google sql参数嗅探以获取更多信息。