如何在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 - ??? "
也许有一种方法重写一遍? 谢谢
答
肯定是一个糟糕的构造声明,但是它最终检查一个真值声明,其中1 = 1.首先检查一个空变量,然后如果该变量不为空,则检查tblCompanies中的CompanyGUID是否在在变量中提供的列表,如果找到它就返回1(因此1 = 1是真的,所以记录匹配),或者如果找不到(在这种情况下0 = 1,这是错误的,所以记录不匹配)。可怕的东西!
+0
同意这个做得很差。逻辑的混淆不是编码技能的标志。 – Namphibian
...有人可能试图避免需要动态SQL,但除非他们采取了某些步骤,可能会适得其反(可能会伤害到性能)。更奇怪的是,他们将_all_ id转储到临时表中,这意味着他们可以只是执行一个'JOIN',而不是古怪的案例逻辑(授予,没有检查的语句表现更好)。尽管除非'StringOfGuidsToTable'返回不同的结果,否则'JOIN'不保证返回相同的结果。 –
正如你写的那样,WHERE条件应该会抛出一个错误,因为tblCompanies不是你的查询的一部分,它在语法上也不正确,但即使它对我来说没有任何意义,除非你有更多的疑问没有显示... – ZLK
我认为写这个的人想要做的是说“如果@ CompanyGuids'为NULL,选择所有内容,否则检查'@ CompanyGuidsTbl'中的GUID是否在tblCompanies中,但这需要或者tblCompanies或'@ CompanyGuidsTbl'在最后的查询中,他们不是......?或者它试图检查'@ CompanyGuids'字符串中的所有GUID是否在tblCompanies中,并且只在结果为真时才显示结果?或者至少有一个是?很难说没有看到实际的查询。 – ZLK