【问题标题】:T-SQL Skip cte Table and Union when Variable Is Null当变量为空时,T-SQL 跳过 cte 表和联合
【发布时间】:2017-01-30 15:31:58
【问题描述】:

我有一个查询,其中包含我们工厂的所有发货和成本。 Google Drive 上的示例数据和所需输出:

https://drive.google.com/open?id=0B4xdnV0LFZI1VndEaGgxNDVpU2M

问题是我们有两种不同的销售方式。一个是我们制造的“Regluar”,另一个是我们买卖它的“买/卖”。

为了获取成本,我必须编写两个查询,每个场景一个。此查询的最终用户可以输入一个日期范围,然后查询运行良好,但是当涉及到变量 @Job_No 时我被卡住了。

通过我们工厂 (cteRegularJobs) 的所有工作都有一个与之关联的工作编号,并且我声明了一个变量,以便用户可以使用它进行搜索。 cteBuyandSell 在 SELECT 语句中声明的 Job_No 的值为“NULL”,因此我可以在最后对这两个表进行 UNION。但是,没有任何购买/销售工作分配有工作编号,它们始终为 NULL。

最初@Job_No 被声明为'',当它离开时''我希望返回两个cte 表的结果。如果用户有一个条目,即“001”,那么我想要 cteRegularJobs 的结果。

如果它更容易,我愿意声明 cteBuyandSell.Job_No 除了 NULL 之外的其他内容,例如“Buy and Sell”。

真正的查询很复杂,所以这里有一个简化的结构示例:

DELCARE @Job_No AS varchar(10) = '';
SET @Job_No = {User Input or leave as ''};

WITH
    cteBuyandSell AS ( NULL AS 'Job_No',
      ...),
    cteRegularJobs AS (tblJobs.Job_No AS 'Job_No',
      ...
        WHERE tblJobs.Job_No LIKE @Job_No)

SELECT *
FROM
(cteBuyandSell
 UNION
 cteRegularJobs)

【问题讨论】:

  • 我认为样本数据和期望的结果确实有助于解释你在做什么。根据您的描述,CTE 永远不应返回任何行,因为 tblJobs.Job_No 在该表中为 NULL - 如果一个操作数为 NULLLIKE 永远不会返回 true。
  • @GordonLinoff,谢谢你的建议。更新了带有示例数据链接的问题。

标签: sql sql-server tsql variables common-table-expression


【解决方案1】:

您可以在逻辑上使用 IF 语句将其分解以检查变量的值。不过,我建议在空白处使用 NULL。这是一个示例过程...使用您提供的有限代码。

CREATE PROCEDURE getData(@Job_No varchar(10) = NULL)
AS

IF @Job_No IS NULL
    BEGIN

        WITH
            cteBuyandSell AS ( NULL AS 'Job_No',
              ...),
            cteRegularJobs AS (tblJobs.Job_No AS 'Job_No',
              ...
                WHERE tblJobs.Job_No LIKE @Job_No)

        SELECT *
        FROM
        (cteBuyandSell
         UNION
         cteRegularJobs)
    END

ELSE
    BEGIN
        WITH
            cteRegularJobs AS (tblJobs.Job_No AS 'Job_No',
              ...
                WHERE tblJobs.Job_No LIKE @Job_No)

        SELECT * FROM cteRetularJobs

    END

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多