Если подзапрос не возвращает строк, возвращает 0, иначе возвращается значение подзапроса. - PullRequest
0 голосов
/ 14 января 2020

У меня вопрос, и вы, скорее всего, можете мне помочь. У меня есть запрос с подзапросом, который сужает поиск. Запрос заканчивается на этом.

SELECT 
    * 
FROM 
    Purchase
WHERE
    Total < 5000
AND 
    Total > 
            (
                SELECT TOP 1
                   buyamount
                FROM
                   employee
                WHERE
                   manager = 'TST'
                ORDER BY
                   buyamount ASC
            )
ORDER BY Date DESC

Я хочу значение подзапроса после ">" ... но если подзапрос ничего не дает взамен, я хочу, чтобы это было 0. Как мне сделать это?

1 Ответ

1 голос
/ 14 января 2020

В опубликованном примере вы можете просто заключить подзапрос в COALESCE и получить желаемый результат.

SELECT 
    * 
FROM 
    #Purchase
WHERE
    Total < 5000
AND 
    Total > COALESCE(
            (
                SELECT TOP 1
                   buyamount
                FROM
                   #employee
                WHERE
                   manager = 'TST'
                ORDER BY
                   buyamount ASC
            ), 0)
ORDER BY Date DESC

Вы также можете использовать переменную в предоставленном вами примере вместо подзапрос. Я предпочитаю такой подход, потому что он разделяет логи c, облегчая чтение. Подзапросы также могут быть причиной снижения производительности. Если его так расколоть, он должен работать лучше.

DECLARE @BuyAmount INT
SET @BuyAmount = (SELECT TOP 1 BuyAmount FROM #Employee WHERE Manager = 'TST' ORDER BY BuyAmount ASC)
IF @BuyAmount IS NULL SET @BuyAmount = 0

SELECT * 
FROM #Purchase
WHERE Total < 5000 AND Total > @BuyAmount
ORDER BY Date DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...