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)
)
我正在尝试 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)
)