#sql #impala
#sql #impala
Вопрос:
У меня есть таблица, в которой id
поле (не первичный ключ) содержит либо 1
или null
. За последние несколько лет любая заданная часть могла вводиться несколько раз с одним или обоими из этих возможных вариантов.
Я пытаюсь написать оператор, который вернет некоторое значение, если когда-либо будет 1
связан с оператором select . Существует множество полу-повторяющихся строк, некоторые с 1
, а некоторые с null
, но если когда-либо будет a 1
, я хочу вернуть true
, и если есть только null
значения, я хочу вернуть false
. Я не уверен, как это закодировать.
Если это мое SELECT part,id from table where part = "ABC1234"
утверждение
part id
ABC1234 1
ABC1234 null
ABC1234 null
ABC1234 null
ABC1234 1
Я хочу написать оператор, который возвращает true
, потому 1
что существует хотя бы в одной из этих строк.
Ближе всего я подошел к этому, используя CASE
оператор, но я еще не совсем там:
SELECT
a1.part part,
CASE WHEN a2.id is not null
THEN
'true'
ELSE
'false'
END AS id
from table.parts a1, table.ids a2 where a1.part = "ABC1234" and a1.key = a2.key;
Я также попробовал следующий случай:
CASE WHEN exists
(SELECT id from table.ids where id = 1)
THEN
но я получил ошибку subqueries are not supported in the select list
Для приведенного выше SELECT
утверждения, как мне вернуть 1 единственную строку, которая гласит:
part id
ABC1234 true
Комментарии:
1. с чем это связано
mysql
? Тег удален
Ответ №1:
Вы можете использовать условную агрегацию, чтобы проверить, содержит ли часть хотя бы одну строку с id = 1.
SELECT part,'True' id
from parts
group by part
having count(case when id = 1 then 1 end) >= 1
Чтобы вернуть false, когда все идентификаторы являются нулевыми, используйте
select part, case when id_true>=1 then 'True'
when id_false>=1 and id_true=0 then 'False' end id
from (
SELECT part,
count(case when id = 1 then 1 end) id_true,
count(case when id is null then 1 end) id_false,
from parts
group by part) t
Комментарии:
1. Разве это не вернет только те строки, в которых когда-либо было значение
1
в столбце id? Если значение существует там, где его нет1
никогда, оно не будет возвращено какfalse
— если я не неправильно понимаю ваш SQL.2. @BrianPowell .. я только что увидел, что вам также нужно вернуть false, и отредактировал ответ.