Impala SQL, возвращает значение, если строка существует в подмножестве значений

#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, и отредактировал ответ.