【问题标题】:select query to get result set with dynamic column选择查询以获取带有动态列的结果集
【发布时间】:2021-04-15 14:27:30
【问题描述】:

我有以下表格和行,我需要通过表格列获取结果集,必须通过月份日期的天数。我试过了,但需要帮助。

    CREATE TABLE HRTMR
(
  ENO      VARCHAR2(10 BYTE)             NOT NULL,
  DAY1            VARCHAR2(2 BYTE),   DAY2            VARCHAR2(2 BYTE),   DAY3            VARCHAR2(2 BYTE),  DAY4            VARCHAR2(2 BYTE),  DAY5            VARCHAR2(2 BYTE),
  DAY6            VARCHAR2(2 BYTE),  DAY7            VARCHAR2(2 BYTE),  DAY8            VARCHAR2(2 BYTE),  DAY9            VARCHAR2(2 BYTE),  DAY10           VARCHAR2(2 BYTE),
  DAY11           VARCHAR2(2 BYTE),  DAY12           VARCHAR2(2 BYTE),  DAY13           VARCHAR2(2 BYTE),  DAY14           VARCHAR2(2 BYTE),  DAY15           VARCHAR2(2 BYTE),
  DAY16           VARCHAR2(2 BYTE),  DAY17           VARCHAR2(2 BYTE),  DAY18           VARCHAR2(2 BYTE),  DAY19           VARCHAR2(2 BYTE),  DAY20           VARCHAR2(2 BYTE),
  DAY21           VARCHAR2(2 BYTE),  DAY22           VARCHAR2(2 BYTE),  DAY23           VARCHAR2(2 BYTE),  DAY24           VARCHAR2(2 BYTE),  DAY25           VARCHAR2(2 BYTE),
  DAY26           VARCHAR2(2 BYTE),  DAY27           VARCHAR2(2 BYTE),  DAY28           VARCHAR2(2 BYTE),  DAY29           VARCHAR2(2 BYTE),  DAY30           VARCHAR2(2 BYTE),
  DAY31           VARCHAR2(2 BYTE)
)
insert into hrtmr values(
'0000000277', 'GS', 'GS','GS','GS', 'SS','O','GS','GS','GS','GS',   'GS','SS',  'O','GS','GS','GS','GS','GS','SS','O','GS', 'GS','GS',  'GS','GS',  'SS','O','GS','GS','GS','GS')

SELECT  'DAY' || to_number(to_char(to_date(sysdate,'dd-mm-yyyy'),'dd')) "DAY" FROM HRTMR Where ENO = '0000000277'

高于查询结果 DAY10,但我要求它是一个表列,即“DAY10”和结果“GS”我在上述情况下使用 oracle 11g。

【问题讨论】:

    标签: sql oracle select datatable


    【解决方案1】:

    首先,您可以将 DAY1 到 DAY9 列的名称修改为 DAY01 到 DAY09

    其次,你可以把这个to_number(to_char(to_date(sysdate,'dd-mm-yyyy'),'dd'))改成to_number(to_char(sysdate,'dd'))

    第三,也许你应该尝试使用 CASE WHEN :

    SELECT 
        CASE
            WHEN to_number(to_char(sysdate,'dd')) = '01' THEN
                DAY01
            WHEN to_number(to_char(sysdate,'dd')) = '02' THEN
                DAY02
            WHEN to_number(to_char(sysdate,'dd')) = '03' THEN
                DAY03
            WHEN to_number(to_char(sysdate,'dd')) = '04' THEN
                DAY04
            WHEN to_number(to_char(sysdate,'dd')) = '05' THEN
                DAY05
            WHEN to_number(to_char(sysdate,'dd')) = '06' THEN
                DAY06
            WHEN to_number(to_char(sysdate,'dd')) = '07' THEN
                DAY07
            WHEN to_number(to_char(sysdate,'dd')) = '08' THEN
                DAY08
            WHEN to_number(to_char(sysdate,'dd')) = '09' THEN
                DAY09
            WHEN to_number(to_char(sysdate,'dd')) = '10' THEN
                DAY10
            WHEN to_number(to_char(sysdate,'dd')) = '12' THEN
                DAY11
            WHEN to_number(to_char(sysdate,'dd')) = '12' THEN
                DAY12
            WHEN to_number(to_char(sysdate,'dd')) = '13' THEN
                DAY13
            WHEN to_number(to_char(sysdate,'dd')) = '14' THEN
                DAY14
            WHEN to_number(to_char(sysdate,'dd')) = '15' THEN
                DAY15
            WHEN to_number(to_char(sysdate,'dd')) = '16' THEN
                DAY16
            WHEN to_number(to_char(sysdate,'dd')) = '17' THEN
                DAY17
            WHEN to_number(to_char(sysdate,'dd')) = '18' THEN
                DAY18
            WHEN to_number(to_char(sysdate,'dd')) = '19' THEN
                DAY19
            WHEN to_number(to_char(sysdate,'dd')) = '20' THEN
                DAY20
            WHEN to_number(to_char(sysdate,'dd')) = '21' THEN
                DAY21
            WHEN to_number(to_char(sysdate,'dd')) = '22' THEN
                DAY22
            WHEN to_number(to_char(sysdate,'dd')) = '23' THEN
                DAY23
            WHEN to_number(to_char(sysdate,'dd')) = '24' THEN
                DAY24
            WHEN to_number(to_char(sysdate,'dd')) = '25' THEN
                DAY25
            WHEN to_number(to_char(sysdate,'dd')) = '26' THEN
                DAY26
            WHEN to_number(to_char(sysdate,'dd')) = '27' THEN
                DAY27
            WHEN to_number(to_char(sysdate,'dd')) = '28' THEN
                DAY28
            WHEN to_number(to_char(sysdate,'dd')) = '29' THEN
                DAY29
            WHEN to_number(to_char(sysdate,'dd')) = '30' THEN
                DAY30
            WHEN to_number(to_char(sysdate,'dd')) = '31' THEN
                DAY31
        END "DAY"
    FROM HRTMR Where ENO = '0000000277'
    

    【讨论】:

      【解决方案2】:

      如果您想这样做,您需要的是动态 SQL。这是如何做。请注意我修改您的 SELECT 语句的方式(第 5 行); sysdate 是一个返回 date 数据类型的函数,所以 - 你不要 to_date 它。

      SQL> set serveroutput on;
      SQL> declare
        2    l_str varchar2(200);
        3    l_day varchar2(20);
        4  begin
        5    l_str := q'[SELECT  'DAY' || to_number(to_char(sysdate, 'dd')) FROM HRTMR Where ENO = '0000000277']';
        6    execute immediate l_str into l_day;
        7    dbms_output.put_line('Result = ' || l_day);
        8  end;
        9  /
      Result = DAY10
      
      PL/SQL procedure successfully completed.
      
      SQL>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-04
        • 2019-05-10
        • 2015-10-30
        • 1970-01-01
        • 2010-11-24
        相关资源
        最近更新 更多