Sql 如何在where子句中使用cases?

Sql 如何在where子句中使用cases?,sql,sql-server,Sql,Sql Server,我正在尝试选择以下路径之一。用户将输入客户名称(@customer)、供应商名称(@supplier)或零件号(@part)。当他们输入其中一个时,我想在我的表中进行搜索,如customer_name=@customer(如果他们选择customer),如果他们选择其他任何一个,则搜索结果相同。这就是我正在尝试的 CREATE PROCEDURE sp_edit_button ( @customer nvarchar(200) = NULL, @supplier nvarchar

我正在尝试选择以下路径之一。用户将输入客户名称(@customer)、供应商名称(@supplier)或零件号(@part)。当他们输入其中一个时,我想在我的表中进行搜索,如customer_name=@customer(如果他们选择customer),如果他们选择其他任何一个,则搜索结果相同。这就是我正在尝试的

CREATE PROCEDURE sp_edit_button
(
    @customer nvarchar(200) = NULL,
    @supplier nvarchar(200) = NULL,
    @part nvarchar(100) = NULL
)
AS
BEGIN
    SELECT *
    FROM REC_INSP_LOG
    WHERE (
        CASE
            WHEN @customer IS NOT NULL THEN customer_name = @customer
            WHEN @supplier IS NOT NULL THEN supplier_name = @supplier
            WHEN @part IS NOT NULL THEN part_num = @part
        )
END

您可以在不使用大小写表达式的情况下表达此逻辑:

WHERE (@customer IS NULL OR customer_name = @customer) AND
      (@supplier IS NULL OR supplier_name = @supplier) AND
      (@part IS NULL OR part_num = @part)

也就是说,结果查询将无法利用表上的任何索引。如果这是您想要的,那么您将需要使用条件逻辑或动态SQL。

这确实无法工作,因为您正踏着动态SQL的领域。还要注意,您的
案例
应该在结尾处有一个
结尾
。 我建议看一下Gordon的答案,或者,如果你打算使用一个案例,你可以尝试以下方法:

(CASE 
    WHEN (@customer IS NOT NULL AND customer_name = @customer)
      OR @supplier IS NOT NULL AND supplier_name = @supplier
      OR @part IS NOT NULL AND part_num = @part THEN 1
    ELSE 0
 END) = 1

但是您仍然无法正确使用索引。

您应该对所有情况进行单独的查询,因为对于所有情况,最有效的访问路径都是不同的。如果可用,这三种情况都可能使用索引查找(在不同的索引上)。您可以添加
选项(重新编译)
以提供帮助,但您需要支付编译成本。是的,我想这可能更容易,不知道这种方法是否更有效。谢谢Martin Smith。改为检查列是否为空并将所有内容与OR链接在一起会更好吗<代码>其中(customer\u name不为NULL,customer\u name=@customer)或(supplier\u name不为NULL,supplier\u name=@supplier)或(part\u num不为NULL,part\u num=@part)应该得出相同的结果,并且可能对索引更有效。@Gamingdevil。这是不同的逻辑,因此也不是更好。