【问题标题】:How to translate nested CASE statement in WHERE clause如何翻译 WHERE 子句中的嵌套 CASE 语句
【发布时间】: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


【解决方案1】:

肯定是一个结构不佳的语句,但是是的,它最终检查的是 1 = 1 的真值语句。首先检查一个空变量,然后如果该变量不为空,它会检查 tblCompanies 中的 CompanyGUID 是否在提供的列表中在变量中,如果找到则返回 1(因此 1 = 1 为真,因此记录匹配),或者如果未找到(在这种情况下,0 = 1,为假,因此记录不匹配)。可怕的东西!

【讨论】:

  • 同意这确实做得不好。混淆逻辑并不是编码技能的标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2014-09-08
  • 2017-06-10
  • 2020-03-26
  • 2017-04-01
  • 1970-01-01
相关资源
最近更新 更多