【发布时间】:2017-09-25 23:21:19
【问题描述】:
我有一个不是我写的存储过程。
你能帮我翻译WHERE子句中的CASE语句吗?
--Declaring the parameter for SP
DECLARE
@CompanyGuids varchar(8000) = '29634AF7-D0A2-473D-9574-405C23E10F02'
--Declaring table variable that will contain only CompanyGuid
DECLARE @CompanyGuidsTbl TABLE(Guid uniqueidentifier)
IF @CompanyGuids IS NULL
BEGIN
INSERT INTO @CompanyGuidsTbl
SELECT DISTINCT CompanyGuid FROM tblCompanies
END
ELSE
BEGIN
INSERT INTO @CompanyGuidsTbl
SELECT * FROM dbo.StringOfGuidsToTable(@CompanyGuids,',')
END
--Select statement
SELECT Col1,
Col2,
Col3
FROM MyTable1 INNER JOIN MyTable2
/* this is where I am confused */
WHERE
CASE WHEN @CompanyGuids IS NOT NULL
THEN
CASE WHEN tblCompanies.CompanyGuid in (SELECT Guid FROM @CompanyGuidsTbl)
THEN 1 ELSE 0 END
ELSE 1
END = 1
如果我错了,请纠正我:
"So if the parameter @CompanyGuids is NOT NULL, then we are checking if table @CompanyGuidsTbl has assigned parameter and if it does - then we gonna use it, but if it does not - ??? "
也许有办法重写它? 谢谢
【问题讨论】:
-
...有人可能试图避免需要动态 sql,但除非他们采取了某些可能适得其反的步骤(并且可能会损害性能)。更奇怪的是,他们将 all id 转储到临时表中,这意味着他们无论如何都可以执行
JOIN,而不是古怪的案例逻辑(当然,有一个没有检查会表现得更好)。尽管 unlessStringOfGuidsToTable返回不同的结果,但JOIN不能保证返回相同的结果。 -
WHERE 条件,如您所写,应该会引发错误,因为 tblCompanies 不是您的查询的一部分,而且它在语法上也不正确,但即使它对我来说毫无意义,除非您还没有显示的查询还有更多...
-
我认为写它的人试图做的是说“如果
@CompanyGuids为NULL,则选择所有内容,否则检查@CompanyGuidsTbl中的GUID是否在tblCompanies中”但这需要tblCompanies 或@CompanyGuidsTbl在最终查询中,它们不是...?或者它正在尝试检查@CompanyGuids字符串中的所有 GUID 是否都在 tblCompanies 中,并且仅在这是真的时才显示结果?或者至少有一个?如果没有看到实际的查询,很难判断它是哪一个。
标签: sql sql-server tsql case