6

我有一些正整数的表

n
----
1
2
5
10

对于该表的每一行,我希望通过 SQL 语句计算值cos(cos(...cos(0)..))(应用 n 次) (不允许使用 PL/SQL 存储过程和函数): cos

n   coscos
--- --------
1   1
2   0.540302305868
5   0.793480358743
10  0.731404042423

可以在 Oracle 11g 中使用递归查询来做到这一点。
是否可以在 Oracle 10g 中做同样的事情?

4

2 回答 2

4

MODEL子句可以解决这个问题:

测试数据:

create table test1(n number unique);
insert into test1 select * from table(sys.odcinumberlist(1,2,5,10));
commit;

询问:

--The last row for each N has the final coscos value.
select n, coscos
from
(
    --Set each value to the cos() of the previous value.
    select * from
    (
        --Each value of N has N rows, with value rownumber from 1 to N.
        select n, rownumber
        from
        (
            --Maximum number of rows needed (the largest number in the table)
            select level rownumber
            from dual
            connect by level <= (select max(n) from test1)
        ) max_rows
        cross join test1
        where max_rows.rownumber <= test1.n
        order by n, rownumber
    ) n_to_rows
    model
    partition by (n)
    dimension by (rownumber)
    measures (0 as coscos)
    (
        coscos[1] = cos(0),
        coscos[rownumber > 1] = cos(coscos[cv(rownumber)-1])
    )
)
where n = rownumber
order by n;

结果:

N   COSCOS
1   1
2   0.54030230586814
5   0.793480358742566
10  0.73140404242251

让圣战开始吧:

这个查询是个好主意吗?我不会在生产中运行这个查询,但希望它是一个有用的演示,任何问题都可以用 SQL 解决。

我已经看到实际上浪费了数千个小时,因为人们害怕使用 SQL。如果您大量使用数据库,那么不使用 SQL 作为您的主要编程语言是愚蠢的。偶尔花几个小时来测试一下 SQL 的极限是很好的。为了避免感染许多数据库程序员的灾难性的逐行处理思维方式,一些奇怪的查询是一个很小的代价。

于 2013-04-23T05:04:05.723 回答
1

使用 WITH FUNCTION(Oracle 12c):

WITH FUNCTION coscos(n INT) RETURN NUMBER IS
BEGIN
   IF n > 1 
     THEN RETURN cos(coscos(n-1));
     ELSE RETURN cos(0);   
   END IF;
END;
SELECT n, coscos(n)
FROM t;

db<>小提琴演示

输出:

+-----+-------------------------------------------+
| N   |                 COSCOS(N)                 |
+-----+-------------------------------------------+
|  1  |                                         1 |
|  2  | .5403023058681397174009366074429766037354 |
|  5  |  .793480358742565591826054230990284002387 |
| 10  | .7314040424225098582924268769524825209688 |
+-----+-------------------------------------------+
于 2019-09-20T18:37:37.217 回答