Проблема в том, что вы пытаетесь использовать 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
вы не можете использовать псевдоним столбца в месте, где ... если вам нужно, вы можете использовать имеющий (который работает со значениями результата или подзапросом)
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'
Вы должны повторить выражение CASE
в предложении WHERE или вложить его в другой оператор SELECT.
Просто еще один вариант
Использование 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 в качестве условия фильтра также работает и просто.
blockquote>Хорошо, вам не нужно выражение
CASE
для столбцаNumber
SELECT 'X' Operation, --Another CASE here if needed ,* FROM TableA WHERE Number like '20%';
Сверните ваш запрос как производную таблицу , затем вы можете поместить новый столбец в предложение 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'
Вы можете использовать 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%'
просто отлично.
С условием, которое вы хотите применить, ваше утверждение эквивалентно:
SELECT 'X' AS Operation, *
FROM
TableA
where Number like '20%'