Я хочу использовать предложение вдоль строк "CASE WHEN ... THEN 1 ELSE 0 END" в операторе выбора. Сложность в том, что мне нужно, чтобы он работал со значением IN @List.
Если я жестко закодирую список, он работает нормально - и работает хорошо:
SELECT
CASE WHEN t.column_a IN ( 'value a', 'value b' ) THEN 1 ELSE 0 END AS priority
, t.column_b
, t.column_c
FROM
table AS t
ORDER BY
priority DESC
Я хотел бы сделать следующее:
-- @AvailableValues would be a list (array) of strings.
DECLARE
@AvailableValues ???
SELECT
@AvailableValues = ???
FROM
lookup_table
SELECT
CASE WHEN t.column_a IN @AvailableValues THEN 1 ELSE 0 END AS priority
, t.column_b
, t.column_c
FROM
table AS t
ORDER BY
priority DESC
К сожалению, похоже, что SQL Server этого не делает - вы не можете использовать переменную с предложением IN. Так что это оставляет меня с некоторыми другими вариантами:
- Сделайте '@AvailableValues' строкой, разделенной запятыми, и используйте оператор LIKE. Это плохо работает.
- Используйте встроенную инструкцию SELECT против lookup_table вместо переменной. Опять же, не очень хорошо работает (я думаю), потому что нужно искать таблицу в каждой строке.
- Напишите функцию, обертывающую оператор SELECT вместо переменной. Я еще не пробовал (попробую сейчас), но, похоже, у него будет та же проблема, что и у прямого оператора SELECT.
- ???
Есть ли другие варианты? Производительность очень важна для запроса - она должна быть очень быстрой, поскольку она подает страницу результатов поиска в реальном времени (то есть без кэширования) для веб-сайта.
Есть ли здесь другие варианты? Есть ли способ улучшить производительность одного из приведенных выше вариантов, чтобы получить хорошую производительность?
Заранее спасибо за любую помощь!
ОБНОВЛЕНИЕ: я должен был упомянуть, что 'lookup_table' в приведенном выше примере уже является табличной переменной. Я также обновил примеры запросов, чтобы лучше продемонстрировать, как я использую предложение.
ОБНОВЛЕНИЕ II: Мне пришло в голову, что предложение IN работает вне поля NVARCHAR / NCHAR (из-за исторических причин создания таблицы). Если бы я должен был внести изменения, относящиеся к целочисленным полям (т.е. через ограничения отношений PK / FK), это могло бы сильно повлиять на производительность?