2016-07-27 114 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 

;