SQL: case - когда оператор с "существует"


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

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 4

5 ответов:

Похоже, что вы пропускаете 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

Есть, вероятно, больше, чем одно решение для этого. Иногда между этими двумя таблицами существует связь. Затем я делаю соединение и обрабатываю его в предложении 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)

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

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)

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

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

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

Не используйте предложение from в вашем exists in a case

Case when exists(select x.foo where blahblah>0 then 1 end) from mydb
Left /inner join somedb x