以前學basic,有些基本練習題,曾經想過種題目能夠用單一SQL做出嗎?
例如: 用迴圈寫出可列印
1
2
3
4
3
2
1
或是
*
**
***
****
***
**
*
這類需求通常不會是SQL開發過程會用到的,但用SQL的數字函數來解,也可以讓頭腦動一動,以防老人癡呆提早到來。
但可能數學觀念要好一點,不然真的會暈頭轉向,舉白旗投降。
癥結點在4之後要逆轉,所以需要用到絕對值的觀念,總筆數是7。
當然你可以直接用decode處理啦~那就把題目改大1~99~1好了!
觀察
select abs(rownum -4) /* (7+1)/2=4, (99+1)/2=50 */
from all_tables
where rownum <= 7
結果是
3
2
1
0
1
2
3
有沒有注意到這是相反的結果,如果把這個數字再用4去減掉呢?
select 4 - abs(rownum -4)
from all_tables
where rownum <= 7
結果是
1
2
3
4
3
2
1
OK,果然是我們要的
這個題型,把這個用法如法炮製即可
rpad('', 4 - abs(rownum -4) , '☆')
萬一題目是偶數行呢?
1
2
3
4
4
3
2
1
試試把4改成4.5,再加上trunc玩看看囉。
2013/9/23 補充
select 4 - trunc(abs(rownum -4.5) ) ans
From All_Tables
where rownum <= 8
"ANS"
1
2
3
4
4
3
2
1
更正☆的寫法,因為''似乎會造成NULL結果。改成' '+1碼
<pre class="c" name="code">select rpad(' ', 1+4 - abs(rownum -4) , '☆') aa
From All_Tables
where rownum <= 7
結果
" ☆"
" ☆☆"
" ☆☆☆"
" ☆☆☆☆"
" ☆☆☆"
" ☆☆"
" ☆"