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 ответов:
Похоже, что вы пропускаете
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)
Но теперь я не чувствую себя крутым парнем : (