ORACLE SQL-Как я могу искать между COLUMN_NAME в таблице и получить значение - PullRequest
1 голос
/ 14 мая 2019

У меня есть таблица с Calendarweeks.Я хочу значения между 2 column_name.Я использую 2 выпадающих для column_name.Я уже пытался (см. Ниже), но, к сожалению, не удалось.Кто-нибудь может мне помочь, пожалуйста?Спасибо

SELECT LISTAGG(COLUMN_NAME, ', ') WITHIN GROUP (ORDER BY COLUMN_ID) 
  FROM ALL_TAB_COLUMNS 
 WHERE TABLE_NAME = 'ALSI_TEST_DELETE' 
   AND COLUMN_NAME BETWEEN :dropdown1 AND :dropdown2

>>>Results:  01, 02, 03, 04 (But without Values, only COLUMN_NAME. I want Values and COLUMN_NAME)

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Я думаю, вам нужно UNPIVOT для вашей проблемы:

WITH ALSI_TEST_DELETE AS (SELECT 7 "01", 8 "02", 9 "03", 10 "04", 11 "05", 12 "06", 1 ID FROM dual)
SELECT ID, COLUMN_ID, COLUMN_VALUE
  FROM ALSI_TEST_DELETE
UNPIVOT 
 (COLUMN_VALUE
  FOR COLUMN_ID IN ("01","02","03","04","05","06"))
 WHERE COLUMN_ID BETWEEN '01' AND '04'

Этот запрос может дать вам начало, и вы можете получить что-то вроде следующего:

SELECT ID, LISTAGG(column_id||': '||column_value,', ') within GROUP (ORDER BY column_id)
  FROM ALSI_TEST_DELETE
UNPIVOT 
 (COLUMN_VALUE
  FOR COLUMN_ID IN ("01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53"))
 WHERE COLUMN_ID BETWEEN :dropdown1 AND :dropdown2
 GROUP BY ID
0 голосов
/ 14 мая 2019

Кажется, вы хотите такой запрос, как показано ниже:

select listagg(column_name,', ') within group (order by column_id)
    as "My Columns List" 
  from user_tab_columns
 where table_name = 'ALSI_TEST_DELETE'
   and column_id between ( select column_id 
                             from user_tab_columns 
                            where table_name = 'ALSI_TEST_DELETE' 
                              and column_name = 'COL1' )
                     and ( select column_id 
                             from user_tab_columns 
                            where table_name = 'ALSI_TEST_DELETE' 
                              and column_name = 'COL4' );

Демо

Более элегантный способ рассмотрения:

with utc as
(
 select table_name as tab_name,
        max(case when column_name = 'COL1' then column_id end) as col1,
        max(case when column_name = 'COL4' then column_id end) as col2 
   from user_tab_columns 
  where table_name = 'ALSI_TEST_DELETE'
  group by table_name
)
select listagg(column_name,', ') within group (order by column_id)
    as "My Columns List" 
  from user_tab_columns
  cross join utc
 where table_name = utc.tab_name
   and column_id between utc.col1 and utc.col2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...