Sql 我正在对付的帽子。这不是我能控制的桌子。是我公司购买的软件的一部分,因此我转换成了数字。感谢您的回复,我对此表示感谢。@Miguel-理解,但您可以控制结果集中列的名称(或者您不知道吗?),因此您可以选择不将其称为ACCT。更重要的是,这是您需要的,还是其
Sql 我正在对付的帽子。这不是我能控制的桌子。是我公司购买的软件的一部分,因此我转换成了数字。感谢您的回复,我对此表示感谢。@Miguel-理解,但您可以控制结果集中列的名称(或者您不知道吗?),因此您可以选择不将其称为ACCT。更重要的是,这是您需要的,还是其,sql,oracle,Sql,Oracle,我正在对付的帽子。这不是我能控制的桌子。是我公司购买的软件的一部分,因此我转换成了数字。感谢您的回复,我对此表示感谢。@Miguel-理解,但您可以控制结果集中列的名称(或者您不知道吗?),因此您可以选择不将其称为ACCT。更重要的是,这是您需要的,还是其他什么?我想输入中有两行,2003-2008和2033-2036。您需要从2003年到2008年以及从2033年到2036年的所有数字,还是从2003年到2036年的所有数字?我的解决方案是后者(所有数字)——这就是你需要的吗? CREATE
我正在对付的帽子。这不是我能控制的桌子。是我公司购买的软件的一部分,因此我转换成了数字。感谢您的回复,我对此表示感谢。@Miguel-理解,但您可以控制结果集中列的名称(或者您不知道吗?),因此您可以选择不将其称为ACCT。更重要的是,这是您需要的,还是其他什么?我想输入中有两行,2003-2008和2033-2036。您需要从2003年到2008年以及从2033年到2036年的所有数字,还是从2003年到2036年的所有数字?我的解决方案是后者(所有数字)——这就是你需要的吗?
CREATE TABLE ACCT (ACCT_FROM VARCHAR2(6) , ACCT_TO VARCHAR2(6) );
INSERT INTO ACCT VALUES ('2015', '2018');
INSERT INTO ACCT VALUES ('2019');
INSERT INTO ACCT (ACCT_FROM) VALUES ('2019');
"ACCT_FROM" "ACCT_TO"
"2015" "2018"
"2019" ""
ACCT
2015
2016
2017
2018
2019
select acct_from from ACCT where
acct_from between '2000' and '2999'
and (ACCT_FROM like '2%' or ACCT_TO like '2%') ;
SELECT Val
FROM
(
SELECT ACCT_FROM AS Val FROM ACCT WHERE ACCT_FROM like '2%'
UNION
SELECT ACCT_TO AS Val FROM ACCT WHERE ACCT_TO like '2%'
) T
ORDER BY Val
with rangeOfAccounts(accounts, acct_to) as (
select to_number(acct_from) as accounts, to_number(ACCT_TO) as acct_to
from acct where acct_from like '2%'
union all
select accounts + 1, ACCT_TO
from rangeOfAccounts
where accounts + 1 <= ACCT_TO
)
select accounts
from rangeOfAccounts
order by accounts
with nrs as ( select rownum +1999 nr from ( select 1 from dual group by cube (1,2,3,4,5,6,7,8,9,10) ) where rownum <= 1000 )
with nrs as ( select rownum +1999 nr from ( select 1 from dual group by cube (1,2,3,4,5,6,7,8,9,10) ) where rownum <= 1000 )
select nrs.nr
from acct
, nrs
where acct_to is not null
and nrs.nr between to_number( acct_from ) and to_number( acct_to )
union
select to_number(acct_from )
from acct
where acct_to is null
and to_number(acct_from) between 2000 and 2999
with
acct ( acct_from, acct_to ) as (
select '2015', '2018' from dual union all
select '2019', null from dual
),
prep ( acct_2xxx ) as (
select to_number(acct_from)
from acct
where acct_from like '2%'
union all
select to_number(acct_to)
from acct
where acct_to like '2%'
),
acct_m ( acct_min, acct_max ) as (
select min(acct_2xxx), max(acct_2xxx)
from prep
)
select to_char(acct_min + level - 1) as acct_all
from acct_m
connect by level <= acct_max - acct_min + 1
;
ACCT_ALL
----------------
2015
2016
2017
2018
2019
5 rows selected.