SQL: случай-когда оператор с «существует» - PullRequest
4 голосов
/ 28 июля 2010

Я бы хотел иметь возможность добавить поле, которое отвечает на вопрос «Для значения в этой записи соответствует ли это значение некоторому условию в другой таблице?». Я думал, что попробую case-when с exists, но Teradata (мои dbms) не нравится. Любые рекомендации?

select foo,
   (case when exists (select x.foo
                      from somedb x
                      where x.bar > 0)
    then '1' else '0' end) as MyFlag

from mydb

Ответы [ 5 ]

11 голосов
/ 28 июля 2010

Похоже, вам не хватает END для оператора CASE?

select foo,
   (case when exists (select x.foo
                      from somedb x
                      where x.bar > 0)
    then '1' else '0' END) as MyFlag

from mydb
3 голосов
/ 28 июля 2010

Вероятно, существует более одного решения для этого. Иногда существует связь между двумя таблицами. Затем я создаю JOIN и обрабатываю его в предложении WHERE. Я не знаю Teradata, но в Oracle я также могу сделать что-то вроде этого.

SELECT foo 
FROM   mydb
WHERE  (select count(*) from somedb where x.bar > 0) > 0

или, может быть, больше похоже на ваш код

select foo,  
   (case when (select count(*)
                      from somedb x  
                      where x.bar > 0) > 0   
    then '1' else '0') as MyFlag       
from mydb

Я знаю, что использовать EXISTS только в предложении WHERE "Я хочу только те строки, в которых следующий SELECT дает мне что-то". Это имеет смысл, только если между одной и другой таблицей есть какая-то связь.

select id,foo from mydb y
where exists (select x.id from somedb x where x.id = y.id)
2 голосов
/ 29 июля 2010

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

create multiset table someDb.NiceFlags as
(
    select t.foo,
           '1' as myFlag
    from someDb.pos_txn_mstr t
    where exists(select x...)

  union all

    select t.foo,
           '0' as myFlag
    from someDb.pos_txn_mstr t
    where not exists(select x...)

) with data primary index(foo)

Но теперь я не чувствую себя крутым парнем: (

0 голосов
/ 02 августа 2012

Не используйте предложение from в вашем существовании в случае

Case when exists(select x.foo where blahblah>0 then 1 end) from mydb
Left /inner join somedb x
0 голосов
/ 28 июля 2010

Поскольку вас интересуют только 1 и 0 в качестве значений флага, попробуйте следующее:

select foo,
   coalesce((select max(1)
             from somedb x
             where x.bar > 0), 0) as MyFlag
from mydb
...