当变量为Null时,T-SQL跳过cte表和Union
我有一个查询,它捕获了我们工厂的所有发货和成本。Google Drive上的示例数据和所需输出如下: 问题是我们有两种不同的销售方式。一个是我们制作的“Regluar”,另一个是我们买卖的“buy/sell” 为了捕获成本,我不得不编写两个查询,每个场景一个查询。这个查询的最终用户可以输入一个日期范围,然后查询工作正常,但是当涉及到变量@Job\u No时,我就卡住了 通过我们工厂(cteRegularJobs)进行的所有工作都有一个与之关联的作业编号,我已经声明了一个变量,以便用户可以使用它进行搜索。cteBuyandSell在SELECT语句中声明的Job_No的值为'NULL',因此我可以在最后合并这两个表。但是,没有任何买入/卖出作业分配了作业编号,它们始终为空 最初@Job_No声明为“”,当它保留为“”时,我希望返回两个cte表的结果。如果用户有一个条目,即“001”,则我希望得到cteRegularJobs的结果 如果这样做更容易,我愿意声明cteBuyandSell.Job\u除了空以外没有其他东西,比如“买卖” 真正的查询很复杂,下面是一个简化的结构示例:当变量为Null时,T-SQL跳过cte表和Union,sql,sql-server,tsql,variables,common-table-expression,Sql,Sql Server,Tsql,Variables,Common Table Expression,我有一个查询,它捕获了我们工厂的所有发货和成本。Google Drive上的示例数据和所需输出如下: 问题是我们有两种不同的销售方式。一个是我们制作的“Regluar”,另一个是我们买卖的“buy/sell” 为了捕获成本,我不得不编写两个查询,每个场景一个查询。这个查询的最终用户可以输入一个日期范围,然后查询工作正常,但是当涉及到变量@Job\u No时,我就卡住了 通过我们工厂(cteRegularJobs)进行的所有工作都有一个与之关联的作业编号,我已经声明了一个变量,以便用户可以使用它
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)
您可以使用IF语句从逻辑上对此进行分解,以检查变量的值。不过我建议在空白处使用空值。下面是一个示例过程。。。使用您提供的有限代码
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
我认为样本数据和期望的结果将真正有助于解释您正在做什么。根据您的描述,CTE不应返回任何行,因为
tblJobs.Job_No
在该表中为NULL——如果一个操作数NULL
@GordonLinoff,则LIKE
不会返回true,谢谢您的建议。更新了问题,并链接到样本数据。