Я работаю с запросом, который содержит оператор "CASE" в предложении "WHERE". Но SQL Server 2008 выдает некоторые ошибки при его выполнении. Может ли кто-нибудь помочь мне с правильным запросом? Вот запрос:
SELECT
tl.storenum 'Store #',
co.ccnum 'FuelFirst Card #',
co.dtentered 'Date Entered',
CASE st.reasonid
WHEN 1 THEN 'Active'
WHEN 2 THEN 'Not Active'
WHEN 0 THEN st.ccstatustypename
ELSE 'Unknown'
END 'Status',
CASE st.ccstatustypename
WHEN 'Active' THEN ' '
WHEN 'Not Active' THEN ' '
ELSE st.ccstatustypename
END 'Reason',
UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Person Entered',
co.comments 'Comments or Notes'
FROM
comments co
INNER JOIN cards cc ON co.ccnum=cc.ccnum
INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE
CASE LEN('TestPerson')
WHEN 0 THEN co.personentered = co.personentered
ELSE co.personentered LIKE '%TestPerson'
END
AND cc.ccnum = CASE LEN('TestFFNum')
WHEN 0 THEN cc.ccnum
ELSE 'TestFFNum'
END
AND CASE LEN('2011-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered = co.DTEntered
ELSE
CASE LEN('2012-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered >= '2011-01-09 11:56:29.327'
ELSE co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327'
END
END
AND tl.storenum < 699
ORDER BY tl.StoreNum
sql
sql-server
case
user1018213
источник
источник
Ответы:
Во-первых,
CASE
утверждение должно быть частью выражения, а не само выражение.Другими словами, у вас может быть:
Но это не будет работать так, как вы их написали, например:
Возможно, вам повезет больше, если вы используете такие комбинированные операторы ИЛИ:
Хотя, в любом случае, я не уверен, насколько хороший план запроса вы получите. Эти типы махинаций в
WHERE
предложении часто не позволяют оптимизатору запросов использовать индексы.источник
co.personentered
не null, в вариантах 1 и 2. Теперь достаточно 3-го варианта. Но я хочу знать, что ... !!where case c when 1 then (DescriptionCode is null) else descriptioncode is not null end
, но я показываю ошибку какIncorrect syntax near the keyword 'is'.
На данный момент это должно решить вашу проблему, но я должен напомнить вам, что это плохой подход:
источник
Попробуйте следующее:
источник
Думаю, начало вашего запроса должно выглядеть так:
НО
что в хвосте совсем не понятно
источник
Там
WHERE
часть можно было бы написать так:источник
Вы также можете попробовать, например, ниже. для отображения только исходящих отправлений
источник
Спасибо за этот вопрос, на самом деле я ищу что-то еще, что находится в запросе ниже. это может кому-то помочь.
Вышеупомянутый запрос должен заполнить раскрывающийся список, пустые значения которого отображаются как «(пусто)». Также, если мы передадим это значение в предложение sql where для получения пустых значений с другими значениями, я не знаю, как с этим справиться. И, наконец, придумал решение ниже, которое может кому-то помочь.
вот ,
источник
вот мое решение
Регадс Дэви
источник
Это работает
источник
Попробуйте следующее:
источник
источник
Используйте таким образом.
источник