【问题标题】:SQL IIF Statement Inside WHEREWHERE 中的 SQL IIF 语句
【发布时间】:2021-08-27 11:54:21
【问题描述】:

我正在尝试根据可能会或可能不会选择的属性选择返回项目列表。这些属性单独列在单独的表 (ItemAttributeMap) 中,并通过 Id 绑定到项目表。属性以逗号分隔的字符串发送到 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)
)

我是不是走错了方向?

【问题讨论】:

    标签: sql iif


    【解决方案1】:

    是的,你完全不在乎。标量表达式不使用可与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)
          )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多