2016-07-27 68 views
0

你好家伙我有点难住这个,希望有人可以借我一只手。 我有这样的桌子。选择两列两列值

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" "" 

我想选择一个查询,将基本上给我从和值在帐户开始的地方之间,2这只是一个子集一张更大的桌子。所以我想最终得到类似的东西

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%') ; 

有人可以帮助我得到合适的结果。

谢谢。

+0

所以 - 你所有的值都是四位数字,有些可能像1996年,另外一些是以2开头的?你想找到以2开头的最小值,以2开头的最大值,然后在一列中填写所有空位?应考虑哪些数字 - 来自输入表两列的所有数字,一起考虑? – mathguy

回答

1

似乎想要这样的事情。这是一个奇怪的要求;也许你用“岁月”只是为了说明,但如果他们真的是年,如果一行有ACCT_FROM = 1997,ACCT_TO = 2003?结果集不应该包括2000年,2001年,2002年,2003年?

无论如何 - 下面的解决方案可以满足您的要求;不是你可能要求的。如果这不是您需要的,请澄清。

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. 

注 - 我还假定你并没有真正的意思是为表和另一个表中的列使用相同的名称(ACCT)。我没有跟随你的领导。

+0

他们实际上是4位数的账户代码。感谢我给我的DLL和我的插入作为一种方式来显示你我到底处理的方式。这不是我控制的桌子。是我公司购买的软件的一部分,因此我转换为一个数字。感谢您对我的回应。 – Miguel

+0

@Miguel - 理解,但是你确实可以控制结果集中列的名称(或者不是吗?)所以你可以选择不叫它ACCT。更重要的是 - 那是你需要的还是其他的东西?我在考虑输入中的两行,2003 - 2008和2033 - 2036.你是否需要2003年到2008年以及2033年到2036年的所有数字,还是2003年到2036年的所有数字?我的解决方案做后者(所有的数字) - 是你需要什么? – mathguy

0

认为您正在寻找这样的:

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 

变化UNIONUNION ALL如果你想保留重复

+0

它错过了2016. – Miguel

+0

啊我现在明白了......你想创造缺失的价值。对于可行的数字,但您的列被声明为varchar。那么你有什么样的价值观呢?现在去睡觉。如果没有人回答,我会在明天看到这个 –

0

确定我有答案。希望这可以帮助别人。

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 
2

我对你有一个很好的。我做了一些假设:varchar coloumn中的数据是数字。或者完全是年份数字。所以,发生了什么

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) 

从2000产生数以2999

工会的第一部分使用它来从“NR发生器”显示所有acct_to和acct_from但只有数字之间的数字。

联合的第二部分添加了2000到2999之间的所有nrs,其中acct_from为空。

工会让你失去所有重复。

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 

;