Возникла проблема с t-sql и оператором case с предложением и / где - PullRequest
1 голос
/ 23 марта 2012
SELECT 3 AS LoggedIn, 83 AS MessageID, Data AS DistID, 1 AS StatusID
    , 0 AS Important
    , CASE WHEN (dd.SponsorID = 3) THEN 0 ELSE d.ReceiveUplineMessages END AS Test
    , dd.SponsorID 
FROM msg_SplitVar(',', @MessageList) sv
INNER JOIN Distributor d 
    ON d.DistID = sv.Data
INNER JOIN DistributorDetail dd 
    ON dd.DistID = sv.Data
WHERE Data NOT IN (SELECT DistID FROM MessageBlockList WHERE BlockedID = 3)
    AND Test = 0

У меня есть поле, установленное в таблице распространителей ReceiveUplineMessages. Это может быть установлено в 0 или 1. Если для них установлено значение 0, я хочу отправить им сообщение, только если оно получено от их спонсора (авторизовано)

У меня есть оператор case, но у меня проблемы с предложением AND.

Функция splitVar просто берет строковый массив '3,4,5,6,7' и разбивает данные на отдельные строки для оператора вставки.

Кто-нибудь знает, что я делаю неправильно в предложении AND? Я только хочу, чтобы они появились, если ReceiveUplineMessages является 0.

1 Ответ

4 голосов
/ 23 марта 2012

старайтесь не использовать свой псевдоним Test в своем предложении WHERE:

SELECT 3 AS LoggedIn, 83 AS MessageID, Data AS DistID, 1 AS StatusID
    , 0 AS Important
    , CASE WHEN (dd.SponsorID = 3) THEN 0 ELSE d.ReceiveUplineMessages END AS Test
    , dd.SponsorID 
FROM msg_SplitVar(',', @MessageList) sv
INNER JOIN Distributor d 
    ON d.DistID = sv.Data
INNER JOIN DistributorDetail dd 
    ON dd.DistID = sv.Data
WHERE Data NOT IN (SELECT DistID FROM MessageBlockList WHERE BlockedID = 3)
    AND (CASE WHEN (dd.SponsorID = 3) THEN 0 ELSE d.ReceiveUplineMessages END) = 0

или заключите свое утверждение в другой SELECT, чтобы использовать свой тест в WHERE:

SELECT t.*    
FROM
(
    SELECT 3 AS LoggedIn, 83 AS MessageID, Data AS DistID, 1 AS StatusID
        , 0 AS Important
        , CASE WHEN (dd.SponsorID = 3) THEN 0 ELSE d.ReceiveUplineMessages END AS Test
        , dd.SponsorID 
    FROM msg_SplitVar(',', @MessageList) sv
    INNER JOIN Distributor d 
        ON d.DistID = sv.Data
    INNER JOIN DistributorDetail dd 
        ON dd.DistID = sv.Data
    WHERE Data NOT IN (SELECT DistID FROM MessageBlockList WHERE BlockedID = 3)
) t
WHERE t.Test = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...