我有一个看起来很简单的SQL查询,我无法弄明白,它让我疯狂。这是SQL 2008.基本上,有一个状态字段,可以选择“挂起”,“满意”或全部。如果他们发送“待定”或“满意”,则没有问题。但当他们选择所有我遇到问题时。主要是因为我无法弄清楚如何获取此字段为空的记录(因为它必须是'is null'而不是'= null'。(这是数据将来的方式;我无法控制。)
我一直在使用的代码不适用于空值。
SELECT * 来自Payment_Table 其中Payment.Status_code = @status_id
答案 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)
编辑:当@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参数嗅探以获取更多信息。