Как отфильтровать данные оператора CASE WHEN, используя условие where?

Проблема в том, что вы пытаетесь использовать javax.mail-api.jar. Это неправильная библиотека. JavaMail - спецификация Java EE, интерфейсы этой спецификации публикуются в этом javax.mail-api-1.6.1.jar, который работает только при компиляции. Он не обеспечивает реализацию спецификации, поэтому он не работает во время выполнения.

Во время выполнения вам необходимо использовать реализацию спецификации JavaMail. Вы можете найти ссылочную реализацию на https://javaee.github.io/javamail/ (но есть и другие, например, серверы приложений Java EE обычно включают в себя один).

Для javax.mail-api.jar, https://javaee.github.io/javamail/ говорит:

Только определения API JavaMail, подходящие для компиляции; использовать только с Maven «предоставленной» областью зависимости

blockquote>

В частности, в вашем случае вам нужны либо javax.mail.jar, либо mailapi.jar + банки определенных протоколов, которые вы хотите использовать. Например, mailapi.jar + smtp.jar, если вам нужна поддержка smtp (s).

С помощью Maven вы можете использовать


    com.sun.mail
    javax.mail
    1.6.1

0
задан Sami 16 January 2019 в 16:14
поделиться

6 ответов

вы не можете использовать псевдоним столбца в месте, где ... если вам нужно, вы можете использовать имеющий (который работает со значениями результата или подзапросом)

SELECT 
    CASE WHEN Number like '20%' THEN 'X'
   WHEN Number like '15%' or  Number like '16%'  THEN 'Y' ELSE 'Z'
   END Operation
   ,*
FROM  TableA
HAVING Operation like 'X'

подзапрос и где

[111 ]

в противном случае вы должны повторно использовать тот же код для case в предложении where

SELECT 
    CASE WHEN Number like '20%' THEN 'X'
   WHEN Number like '15%' or  Number like '16%'  THEN 'Y' ELSE 'Z'
   END Operation
   ,*
FROM  TableA
 WHERE  CASE WHEN Number like '20%' THEN 'X'
   WHEN Number like '15%' or  Number like '16%'  THEN 'Y' ELSE 'Z'
   END like 'X'
0
ответ дан scaisEdge 16 January 2019 в 16:14
поделиться

Вы должны повторить выражение CASE в предложении WHERE или вложить его в другой оператор SELECT.

0
ответ дан Joel Coehoorn 16 January 2019 в 16:14
поделиться

Просто еще один вариант

Использование CTE

WITH CTE AS
(
  SELECT 
      CASE WHEN Number like '20%' THEN 'X'
     WHEN Number like '15%' or  Number like '16%'  THEN 'Y' ELSE 'Z'
     END Operation
     ,*
  FROM 
  TableA
)
SELECT *
FROM CTR
WHERE Operation = 'X';

Использование выражения CASE

SELECT 
    CASE WHEN Number like '20%' THEN 'X'
   WHEN Number like '15%' or  Number like '16%'  THEN 'Y' ELSE 'Z'
   END Operation
   ,*
FROM 
TableA
WHERE CASE WHEN Number like '20%' THEN 'X'
           WHEN Number like '15%' or  Number like '16%'  THEN 'Y' 
           ELSE 'Z'
      END = 'X';

Теперь давайте посмотрим ваш последний комментарий [115 ]

У меня на самом деле есть несколько операторов CASE WHEN, но да, использование Number в качестве условия фильтра также работает и просто.

Хорошо, вам не нужно выражение CASE для столбца Number

SELECT 'X' Operation,
       --Another CASE here if needed
       ,*
FROM 
TableA
WHERE Number like '20%';
0
ответ дан Sami 16 January 2019 в 16:14
поделиться

Сверните ваш запрос как производную таблицу , затем вы можете поместить новый столбец в предложение WHERE:

select * 
from
(
    SELECT 
        CASE WHEN Number like '20%' THEN 'X'
       WHEN Number like '15%' or [Item Number] like '16%'  THEN 'Y' ELSE 'Z'
       END Operation
       ,*
    FROM 
    TableA
) dt
where Operation like 'X'
0
ответ дан jarlh 16 January 2019 в 16:14
поделиться

Вы можете использовать APPLY:

SELECT A.*, AA.*
FROM TableA AS A CROSS APPLY
     ( VALUES (CASE WHEN Number like '20%'  
                    THEN 'X'
                    WHEN (Number like '15%' OR [Item Number] like '16%')  
                    THEN 'Y' ELSE 'Z'
               END ) 
     ) AA(Operation)
WHERE AA.Operation = 'X';

Это будет полезно, если у вас есть и другие фильтры. Однако только WHERE Number LIKE '20%' просто отлично.

0
ответ дан Yogesh Sharma 16 January 2019 в 16:14
поделиться

С условием, которое вы хотите применить, ваше утверждение эквивалентно:

SELECT 'X' AS Operation, *
FROM 
TableA
where Number like '20%'
0
ответ дан forpas 16 January 2019 в 16:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: