【问题标题】:How to do a conditional JOIN with table valued parameter?如何使用表值参数进行条件联接?
【发布时间】:2015-10-06 09:37:28
【问题描述】:

好的,所以我花了一些时间研究这个,但似乎找不到好的解决方案。

我目前正在创建一个采用一组可选参数的存储过程。存储过程将充当多个表和列的“通用搜索查询”。

存储过程看起来像这样(请记住,这只是一个精简版本,实际存储过程有更多列等)

“@ProductIdsParam IntList READONLY”是一个示例表值参数,如果它不为空,我想加入。换句话说,查询应该只搜索非空/非空的参数。

调用过程并解析其他参数就像它应该的那样工作。但是我可能误解了,根本不应该做这样的“通用搜索查询”。

CREATE PROCEDURE [dbo].[usp_Search]

    @ProductIdParam INT = NULL,
    @CustomerNameParam NVARCHAR(100) = NULL,
    @PriceParam decimal = NULL,

    -- THIS IS WHAT I'D LIKE TO JOIN. BUT THE TABLE CAN BE EMPTY
    @ProductIdsParam IntList READONLY

AS
BEGIN
    SET NOCOUNT ON;

    SELECT DISTINCT 

    CustomerTransactionTable.first_name AS FirstName, 
    CustomerTransactionTable.last_name AS LastName,
    ProductTable.description AS ProductDescription,
    ProductTable.price as ProductPrice

FROM dbo.customer AS CustomerTransactionTable

-- JOINS
LEFT JOIN dbo.product AS ProductTable 
        ON CustomerTransactionTable.product_id = ProductTable.id


WHERE
    (ProductTable.id = @ProductIdParam OR @ProductIdParam IS NULL)
    AND (CustomerTransactionTable.first_name = @CustomerNameParam OR @CustomerNameParam IS NULL)
    AND (CustomerTransactionTable.price = @PriceParam OR @PriceParam IS NULL)

END

【问题讨论】:

  • 也可以使用动态sql查询

标签: sql-server stored-procedures parameters table-valued-parameters


【解决方案1】:

您可以在LEFT join中添加int表,然后根据过滤表中的记录数添加where条件。如果@ProductIdsParam 声明为表,则应先统计其中的记录并将结果存储在变量中。

AND COALESCE(@ProductIdsParam.id, 0) = (CASE WHEN @ProductIdsCount = 0 THEN 0 ELSE ProductTable.id END)

如果@ProductIdsCount = 0,那么你总是得到 0 = 0,所以你得到所有记录,否则你只选择过滤表中 productId 等于 ProductTable.id 的记录。

虽然还有其他(可能更清洁)方法可能,但我认为这可行。

【讨论】:

  • 非常感谢朱利奥。我实际上正要编辑我的帖子,因为我用类似的东西解决了它。但相反,我声明了一个新的 int ,它在其中获取记录数,然后在 where 子句中检查它。我认为你的方式更干净:)
  • 我觉得switch条件很重,如果where条件太多或者数据太多,那么你的sql查询会很慢
  • @Ravi 感谢您的评论!我实际上从未在我的最终解决方案中使用切换。我会尽量抽出时间在我的问题中发布最终解决方案!
猜你喜欢
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
相关资源
最近更新 更多