2016-05-30 18 views
1

我想画两个图案和我坚持用不同的问题:绘制图案使用Oracle SQL

1)

******************* 
****************** 
***************** 
**************** 
*************** 
************** 
************* 
************ 
*********** 
********** 
********* 
******** 
******* 
****** 
***** 
**** 
*** 
** 
* 
NULL 

我已经写了下面的查询来获取这样的:

select CASE WHEN (r2-r1)!=0 THEN 
     rpad('*',r2-r1,'*') END 
from (select rownum r1 
      ,(max(level) over()) as r2 
    from dual 
    connect by level<=20); 

我面临的问题(如果你看图)是空的即将结束。我无法想出办法摆脱这一点。

2)我想绘制与每个星星之间的空间相同的模式。卡在这里太..

所有的帮助将是非常可观的。

+0

您所面临的两个问题,你只抓到在末尾空,但如果你需要的最长的字符串是20个星号,这是不 - 它只有19。 – mathguy

回答

0
SQL> select rpad('*', level, '*') as c from dual connect by level <= 20 order by 
    length(c) desc; 

C 
------------------------------------ 
******************** 
******************* 
****************** 
***************** 
**************** 
*************** 
************** 
************* 
************ 
*********** 
********** 
********* 
******** 
******* 
****** 
***** 
**** 
*** 
** 
* 

20 rows selected. 

SQL> select rpad('*', 2*level-1, ' *') as c from dual connect by level <= 20 order by 
    length(c) desc; 

C 
-------------------------------------------------- 
* * * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * * 
* * * * * * * * * * * * * * 
* * * * * * * * * * * * * 
* * * * * * * * * * * * 
* * * * * * * * * * * 
* * * * * * * * * * 
* * * * * * * * * 
* * * * * * * * 
* * * * * * * 
* * * * * * 
* * * * * 
* * * * 
* * * 
* * 
* 

20 rows selected. 
0

就过滤掉的行,其中最大等于ROWNUM:

SELECT 
    rpad('*', r2 - r1, '*') c1, 
    rpad('* ', (r2 - r1) * 2, '* ') c2 
FROM 
    (SELECT ROWNUM r1, max(LEVEL) OVER() AS r2 FROM dual CONNECT BY LEVEL <= 20) 
WHERE 
    r1 < r2