Как остановить выполнение условия else в операторах SQL - PullRequest
0 голосов
/ 21 октября 2019
SELECT DISTINCT 
    DO.Contract_Number AS Contract_Number,
    CASE 
       WHEN w3.ContractNo <> DO.Contract_Number 
          THEN 'Ambiguity in contract No'
    END AS Remarks
FROM 
    weight3 w3, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID

UNION ALL

SELECT DISTINCT 
    w3.ContractNo AS contract_number,
    CASE 
       WHEN w3.Transporter_Name <> TI.TransporterName 
          THEN 'Ambiguity in Transporter Name'
    END AS Remarks
FROM 
    weight3 w3, TransporterInformation TI, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID

Я хочу удалить результат else из оператора case после удаления, иначе он возвращает ноль.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Вы должны добавить условие из оператора CASE в WHERE и просто удалить CASE, как показано ниже.

SELECT DISTINCT 
    DO.Contract_Number AS Contract_Number,
    'Ambiguity in contract No' AS Remarks
FROM 
    weight3 w3, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID AND w3.ContractNo <> DO.Contract_Number 

UNION ALL

SELECT DISTINCT 
    w3.ContractNo AS contract_number,
    'Ambiguity in Transporter Name' AS Remarks
FROM 
    weight3 w3, TransporterInformation TI, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID AND w3.Transporter_Name <> TI.TransporterName 

Редактировать

Если выожидая несколько WHEN операторов для каждого CASE, тогда вы должны использовать OR в условии WHERE, как показано ниже.

SELECT DISTINCT 
    DO.Contract_Number AS Contract_Number,
    CASE 
        WHEN conditiion1
            THEN 'value1'
        WHEN conditiion2
            THEN 'value2'
        ELSE ''
    END AS Remarks
FROM 
    weight3 w3, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID AND (conditiion1 OR conditiion2)

UNION ALL

SELECT DISTINCT 
    w3.ContractNo AS contract_number,
    CASE 
        WHEN conditiion1
            THEN 'value1'
        WHEN conditiion2
            THEN 'value2'
        ELSE ''
    END AS Remarks
FROM 
    weight3 w3, TransporterInformation TI, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID AND (conditiion1 OR conditiion2)

Редактировать 2: использовать стандартный оператор JOIN вместо старого синтаксиса соединения

Как предложил @Gordon Linoff, лучше использовать стандартную инструкцию JOIN поверх старой. Вы найдете несколько блогов или сообщений, связанных с этой темой, некоторые из них здесь. SQL SERVER - Почему бы вам не использовать старый стиль JOIN? или Использовать ключевое слово JOIN или нет .

Я переписываю здесь первый оператор SELECT для примера.

SELECT DISTINCT 
    DO.Contract_Number AS Contract_Number,
    CASE 
        WHEN conditiion1
            THEN 'value1'
        WHEN conditiion2
            THEN 'value2'
        ELSE ''
    END AS Remarks
FROM 
    weight3 w3
    INNER JOIN Delivery_Order DO ON w3.DO_UID = DO.DO_UID 
WHERE 
    (conditiion1 OR conditiion2)
1 голос
/ 21 октября 2019

@ nado1122,

Я вижу, что вы используете перекрестные объединения, но я не уверен, что это лучший способ присоединиться (если ваш сценарий использования не очень конкретен). Однако вы можете избежать использования else части условия условия, включив только те строки, которые соответствуют вашим критериям. Я считаю, что это должно решить ваш запрос:

SELECT DISTINCT 
    DO.Contract_Number AS Contract_Number,
    'Ambiguity in contract No' AS Remarks
FROM 
    weight3 w3 JOIN Delivery_Order DO 
ON 
    w3.DO_UID = DO.DO_UID
WHERE 
    w3.ContractNo <> DO.Contract_Number

UNION ALL

SELECT DISTINCT 
    w3.ContractNo AS contract_number,
    'Ambiguity in Transporter Name' AS Remarks
FROM 
    weight3 w3, TransporterInformation TI, Delivery_Order DO 
WHERE 
    w3.DO_UID = DO.DO_UID
    AND 
    w3.Transporter_Name <> TI.TransporterName;

Дайте мне знать, если это работает для вас.

...