SQL WHERE 内的 IIF 语句

SQL IIF Statement Inside WHERE

我正在尝试 return 基于选择的属性选择的项目列表,这些属性可能会被选中,也可能不会被选中。这些属性单独列在单独的 table (ItemAttributeMap) 中,并通过 Id 绑定到项目 table。属性以逗号分隔的字符串形式发送到 api。我知道只要选择了一个属性,下面的代码就可以工作:

SELECT * FROM ItemCatalog 
WHERE ItemCatalog.Id IN 
    (SELECT ItemAttributeMap.ItemCatalogId FROM ItemAttributeMap WHERE ItemAttributeMap.AttributeId IN (SELECT * FROM STRING_SPLIT(@Attributes, ',')))

但是,由于可能没有选择任何属性过滤器,我必须处理@Attributes 参数为空字符串的情况。我尝试了以下方法,但它不起作用:

WHERE ItemCatalog.Id IN IIF
(
    LEN(@Attributes) > 0,
    (SELECT ItemAttributeMap.ItemCatalogId FROM ItemAttributeMap WHERE ItemAttributeMap.AttributeId IN (SELECT * FROM STRING_SPLIT(@Attributes, ','))),
    (SELECT ItemCatalog.Id FROM ItemCatalog)
)

我是不是走错了方向?

是的,你完全不在乎。标量表达式不使用可与 IN.

一起使用的列表

相反,只需使用布尔逻辑:

WHERE (LEN(@Attributes) > 0 AND 
       ItemCatalog.Id IN (SELECT ItemAttributeMap.ItemCatalogId FROM ItemAttributeMap WHERE ItemAttributeMap.AttributeId IN (SELECT * FROM STRING_SPLIT(@Attributes, ',')))
      ) OR
      (LEN(@Attributes) = 0
       ItemCatalog.Id IN (SELECT ItemCatalog.Id FROM ItemCatalog)
      )