Как вернуть несколько значений с помощью оператора case в oracle - PullRequest
0 голосов
/ 11 ноября 2009

Я хочу вернуть несколько значений из запроса в Oracle. Например:

select count(*)
from tablename a 
where asofdate='10-nov-2009'
and a.FILENAME in (case 
    when 1 = 1 then (select distinct filename from tablename 
        where asofdate='10-nov-2009' and isin is null) 
    else null
end);

Я получаю ошибку: ora 01427 подзапрос одной строки возвращает более одной строки

Пожалуйста, совет.

Спасибо, Дипак

Ответы [ 4 ]

3 голосов
/ 11 ноября 2009

Оператор CASE не может возвращать более одного значения, это функция, работающая с одним значением.

Это не требуется для вашего заявления, это утверждение должно работать:

select count(*) 
from tablename a 
where asofdate='10-nov-2009' 
and a.FILENAME in (select distinct filename 
    from tablename 
    where asofdate='10-nov-2009'
    and isin is null);

Может быть, вы имеете в виду другой сценарий использования? Что-то вроде этого: Выбрать * Из таблицы Где в случае Когда тогда Когда тогда ELSE END

Тогда использование CASE может оказаться неправильным сценарием. Может быть, это поможет вам в правильном направлении:

Select *
From aTable
Where <Case1> and  column1 in <Subselect1>
Or <Case2> and column1 in <Subselect2>
OR Not (<Case1> Or <Case2>) and column1 in <Subselect3>

Но, вероятно, это будет довольно трудоемко для оптимизатора ...

3 голосов
/ 11 ноября 2009

отдельный в вашем операторе Case пытается вернуть несколько значений, когда разрешено только одно, а ваш оператор SELECT в настоящее время возвращает только одно значение в одной строке. Если вы пытаетесь получить счетчик каждого имени файла, выполните

SELECT FileName, Count(*)
FROM tablename
WHERE asofdate='10-nov-2009' and isin is null
GROUP BY FileName
0 голосов
/ 11 ноября 2009

Насколько я могу судить, вы ищете что-то вроде:

select a.filename, count(*)
from tablename a
where a.asofdate = '10-nov-2009' 
and exists (
    select *
    from tablename b
    where b.isin is null
    and a.asofdate = '10-nov-2009' 
    and a.filename = b.filename
)
group by a.filename

Здесь можно найти количество имен файлов за день, для которого существует хотя бы одна строка, в которой isin is null.

Если вы отредактируете свой вопрос и добавите объяснение того, что вы ищете, вы можете получить лучшие ответы.

0 голосов
/ 11 ноября 2009

Запустите этот запрос:

select distinct filename from tablename 
where asofdate='10-nov-2009' and isin is null

Вы увидите, что он возвращает более одной строки, которая вызывает ORA-01427.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...