Я не знаю, что здесь происходит, я пробую это:
Но результат никогда не возвращает 0, что я делаю не так? Обновлено:
все строки в таблице
Я использую «WHERE i.ID = '221'», потому что мне нужно вернуть 0, когда в таблице не существует строки с идентификатором 221.
Пожалуйста, добавьте несколько строк образцов данных и ожидаемый результат.
Когда вы просите о помощи, вы получите больше/лучших ответов, если вы не будете публиковать скриншоты или фотографии . Вырежьте и вставьте текст прямо в сообщение. Почему? 1. Людям легче читать. 2. Это позволяет тем, кто читает его, вырезать и вставлять текст, облегчая работу над решением вашей проблемы. 3. Это делает его доступным для поиска, чтобы кто-то мог найти эту тему при поиске информации в Google в будущем. 4. Программа чтения с экрана не может прочитать изображение, что ограничивает доступ к некоторым в нашем сообществе. Смотрите также idownvotedbecau.se/imageofcode
Отвечает ли это на ваш вопрос? Oracle: сделайте так, чтобы запрос всегда возвращал ровно одну строку, даже если данные не найдены
Я думаю, что это должно быть что-то вроде ниже:
with qt as (
--- here comes your query returning the desired result if found
)
select test
from qt
union all
select 0 --- this produces 0 when your query returns no rows
from dual where not exists (select 1 from qt)
В Oracle оператор CASE не проходит — он ломается/выходит при первом успешном тесте. Поэтому ваши первые два теста:
WHEN (i.id IS NULL) THEN..
WHEN (i.id IS NOT NULL) THEN..
Покрыть 100% всех возможных случаев. Значение либо NULL, либо NOT NULL, поэтому одно из этих двух будет истинным, а остальные ваши тесты никогда не будут оцениваться. Я думаю, вам, вероятно, нужны отдельные столбцы для выполнения различных тестов, которые вы хотите. По крайней мере, один столбец для обнуления и один столбец для длины и всего, что вам нужно.
Что касается следующего выражения, у вас есть NVL(i.id,0)
, но в вашем предложении WHERE вы запрашиваете id = '221'
. Поскольку вы возвращаете только значения 221, ни одна из строк не будет иметь значение NULL в столбце id, поэтому NVL не выдаст 0.
Он никогда не доходит до последнего из-за первого. Как только оператор when возвращает значение true, оператор case закрывается.