SQLite — возвращает имена столбцов данных, отличные от Null, после предложений With

#sql #sqlite #inner-join #unpivot #union-all

#sql #sqlite #внутреннее соединение #отменить #объединение-все

Вопрос:

Я пытаюсь получить имена столбцов из запроса. Имена столбцов в моем случае — это напряжения батареи, и не каждый идентификатор совместим с каждым напряжением батареи, поэтому у меня есть 2-я таблица, в которой отображаются идентификаторы, которые имеют какое напряжение. Если значение равно null, то оно не поддерживает это напряжение. Я хотел бы получить окончательный запрос напряжений для этого идентификатора. Итак, имена столбцов, в которых есть данные.

Я попробовал следующее в надежде, что оно вернет два столбца, names и notnull, чтобы затем я мог выполнить последний запрос по этому вопросу и отфильтровать нулевые данные и получить результирующее напряжение батареи. Но следующее ничего не вернуло и ошибок не было.

  WITH previous_results AS(SELECT *
      FROM Table1
      JOIN Table2
      ON Table1.table2id = Table2.table2id
), second_results AS( SELECT *
  FROM previous_results
  WHERE previous_results.id= '2'
  )

 SELECT c.name, c.[notnull] FROM pragma_table_info('second_results') c ;
  
 

Этот способ, вероятно, не сработает, так что может кто-нибудь помочь мне с решением? Я предоставил визуальный образ, чтобы вы могли увидеть, что я ищу в конце. введите описание изображения здесь

Ответ №1:

Похоже, вам нужны имена столбцов table2 , которые имеют ненулевые значения для данного id . Если это так, вы можете использовать union all :

 select '12' as colname from table2 where tbl2_id = 2 and col_12 is not null
union all select '24'  from table2 where tbl2_id = 2 and col_24 is not null
union all select '48'  from table2 where tbl2_id = 2 and col_48 is not null
 

Я предположил, что имена столбцов col_12 col_24 и col_48 в table2 .

Если вы действительно хотите выполнить фильтрацию по id from table1 , то вы можете join и перенести фильтрацию на id where предложение внешнего запроса:

 select t2.colname
from (
    select tbl2_id, '12' as colname from table2 where col1_12 is not null
    union all select tbl2_id, '24'  from table2 where col1_24 is not null
    union all select tbl2_id, '48'  from table2 where col1_48 is not null
) t2
inner join table1 t1 on t1.tbl2_id = t2.tbl2_id
where t1.id = 2