如何在WHERE子句中转换嵌套的CASE语句

问题描述:

我有一个不是由我写的存储过程。 您能否帮我翻译CASE条款WHERE条款?如何在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 - ??? " 

也许有一种方法重写一遍? 谢谢

+0

...有人可能试图避免需要动态SQL,但除非他们采取了某些步骤,可能会适得其反(可能会伤害到性能)。更奇怪的是,他们将_all_ id转储到临时表中,这意味着他们可以只是执行一个'JOIN',而不是古怪的案例逻辑(授予,没有检查的语句表现更好)。尽管除非'StringOfGuidsToTable'返回不同的结果,否则'JOIN'不保证返回相同的结果。 –

+0

正如你写的那样,WHERE条件应该会抛出一个错误,因为tblCompanies不是你的查询的一部分,它在语法上也不正确,但即使它对我来说没有任何意义,除非你有更多的疑问没有显示... – ZLK

+0

我认为写这个的人想要做的是说“如果@ CompanyGuids'为NULL,选择所有内容,否则检查'@ CompanyGuidsTbl'中的GUID是否在tblCompanies中,但这需要或者tblCompanies或'@ CompanyGuidsTbl'在最后的查询中,他们不是......?或者它试图检查'@ CompanyGuids'字符串中的所有GUID是否在tblCompanies中,并且只在结果为真时才显示结果?或者至少有一个是?很难说没有看到实际的查询。 – ZLK

肯定是一个糟糕的构造声明,但是它最终检查一个真值声明,其中1 = 1.首先检查一个空变量,然后如果该变量不为空,则检查tblCompanies中的CompanyGUID是否在在变量中提供的列表,如果找到它就返回1(因此1 = 1是真的,所以记录匹配),或者如果找不到(在这种情况下0 = 1,这是错误的,所以记录不匹配)。可怕的东西!

+0

同意这个做得很差。逻辑的混淆不是编码技能的标志。 – Namphibian