Оператор SQL IIF Внутри, ГДЕ

#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)
      )