#sql #iif
Вопрос:
Я пытаюсь вернуть список элементов на основе набора атрибутов, которые могут быть выбраны или не выбраны. Эти атрибуты перечислены в отдельной таблице (карта атрибутов элементов) сами по себе и привязаны к таблице элементов с помощью идентификатора. Атрибуты отправляются в 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)
)
Неужели я иду в совершенно неправильном направлении с этим?
Ответ №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)
)