查看: 1523|回复: 19

刑侦高考:如何用SQL解决环环相扣的刑侦推理问题

[复制链接]
论坛徽章:
530
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2018-6-11 11:11 | 显示全部楼层 |阅读模式
这是我刚刚在恩墨的公众号看到的,好像以前在itpub也出现过,至少和那个什么爱因斯坦的谜题是很像的:
https://mp.weixin.qq.com/s/n88Rtfgc-U76CYJ5H2RUMw

刑侦高考:如何用SQL解决环环相扣的刑侦推理问题[color=rgba(0, 0, 0, 0.3)]原创: [color=rgba(0, 0, 0, 0.3)]杨廷琨 [url=]数据和云[/url] [color=rgba(0, 0, 0, 0.3)]今天
关注我们获得更多精彩内容!
高考期间看到一个朋友在朋友圈里面贴了个图,上面是2018年刑侦科推理试题,看了一下题目,这些题目都是彼此依赖,很难找到一个题目作为入手点可以进一步分析,因此可能需要用纸笔配合大量的假设和试错才能继续完成。

原题如下,大家可以先烧烧脑,再来看解决方案:

这种问题其实是SQL擅长的领域,于是一时手痒,写了一个SQL语句:
SQL> WITH T AS
  2  (SELECT ASCII('A') R FROM DUAL
  3  UNION ALL
  4  SELECT ASCII('B') FROM DUAL
  5  UNION ALL
  6  SELECT ASCII('C') FROM DUAL
  7  UNION ALL
  8  SELECT ASCII('D') FROM DUAL),
  9  RESULT AS
10  (SELECT T1.R R1, T2.R R2, T3.R R3, T4.R R4, T5.R R5, T6.R R6, T7.R R7, T8.R R8, T9.R R9, T10.R R10,
11     DECODE(T1.R, ASCII('A'), 1, 0) + DECODE(T2.R, ASCII('A'), 1, 0) + DECODE(T3.R, ASCII('A'), 1, 0) + DECODE(T4.R, ASCII('A'), 1, 0)
12             + DECODE(T5.R, ASCII('A'), 1, 0) + DECODE(T6.R, ASCII('A'), 1, 0) + DECODE(T7.R, ASCII('A'), 1, 0)
13             + DECODE(T8.R, ASCII('A'), 1, 0) + DECODE(T9.R, ASCII('A'), 1, 0) + DECODE(T10.R, ASCII('A'), 1, 0) A,
14     DECODE(T1.R, ASCII('B'), 1, 0) + DECODE(T2.R, ASCII('B'), 1, 0) + DECODE(T3.R, ASCII('B'), 1, 0) + DECODE(T4.R, ASCII('B'), 1, 0)
15             + DECODE(T5.R, ASCII('B'), 1, 0) + DECODE(T6.R, ASCII('B'), 1, 0) + DECODE(T7.R, ASCII('B'), 1, 0)
16             + DECODE(T8.R, ASCII('B'), 1, 0) + DECODE(T9.R, ASCII('B'), 1, 0) + DECODE(T10.R, ASCII('B'), 1, 0) B,
17     DECODE(T1.R, 'C', 1, 0) + DECODE(T2.R, ASCII('C'), 1, 0) + DECODE(T3.R, ASCII('C'), 1, 0) + DECODE(T4.R, ASCII('C'), 1, 0)
18             + DECODE(T5.R, ASCII('C'), 1, 0) + DECODE(T6.R, ASCII('C'), 1, 0) + DECODE(T7.R, ASCII('C'), 1, 0)
19             + DECODE(T8.R, ASCII('C'), 1, 0) + DECODE(T9.R, ASCII('C'), 1, 0) + DECODE(T10.R, ASCII('C'), 1, 0) C,
20     DECODE(T1.R, ASCII('D'), 1, 0) + DECODE(T2.R, ASCII('D'), 1, 0) + DECODE(T3.R, ASCII('D'), 1, 0) + DECODE(T4.R, ASCII('D'), 1, 0)
21             + DECODE(T5.R, ASCII('D'), 1, 0) + DECODE(T6.R, ASCII('D'), 1, 0) + DECODE(T7.R, ASCII('D'), 1, 0)
22             + DECODE(T8.R, ASCII('D'), 1, 0) + DECODE(T9.R, ASCII('D'), 1, 0) + DECODE(T10.R, ASCII('D'), 1, 0) D
23  FROM T T1, T T2, T T3, T T4, T T5, T T6, T T7, T T8, T T9, T T10
24  WHERE DECODE(CHR(T2.R), 'A', 'C', 'B', 'D', 'C', 'A', 'B') = CHR(T5.R)
25  AND (CASE CHR(T3.R) WHEN 'A' THEN LEAST(T2.R, T4.R, T6.R) - GREATEST(T2.R, T4.R, T6.R)
26     WHEN 'B' THEN LEAST(T2.R, T3.R, T4.R) - GREATEST(T2.R, T3.R, T4.R)
27     WHEN 'C' THEN LEAST(T3.R, T4.R, T6.R) - GREATEST(T3.R, T4.R, T6.R)
28     ELSE LEAST(T2.R, T3.R, T6.R) - GREATEST(T2.R, T3.R, T6.R) END) = 0
29  AND (CASE CHR(T3.R) WHEN 'A' THEN T2.R - T3.R
30     WHEN 'B' THEN T2.R - T6.R
31     WHEN 'C' THEN T3.R - T2.R
32     ELSE T2.R - T4.R END) != 0
33  AND (CASE CHR(T4.R) WHEN 'A' THEN T1.R - T5.R
34     WHEN 'B' THEN T2.R - T7.R
35     WHEN 'C' THEN T1.R - T9.R
36     ELSE T6.R - T10.R END) = 0
37  AND (CASE CHR(T5.R) WHEN 'A' THEN T8.R - ASCII('A')
38     WHEN 'B' THEN T4.R - ASCII('B')
39     WHEN 'C' THEN T9.R - ASCII('C')
40     ELSE T10.R - ASCII('D') END) = 0
41  AND (CASE CHR(T6.R) WHEN 'A' THEN LEAST(T2.R, T4.R, T8.R) - GREATEST(T2.R, T4.R, T8.R)
42     WHEN 'B' THEN LEAST(T1.R, T6.R, T8.R) - GREATEST(T1.R, T6.R, T8.R)
43     WHEN 'C' THEN LEAST(T3.R, T10.R, T8.R) - GREATEST(T3.R, T10.R, T8.R)
44     ELSE LEAST(T5.R, T9.R, T8.R) - GREATEST(T5.R, T9.R, T8.R) END) = 0
45  AND (CASE CHR(T8.R) WHEN 'A' THEN ABS(T7.R - T1.R)
46     WHEN 'B' THEN ABS(T5.R - T1.R)
47     WHEN 'C' THEN ABS(T2.R - T1.R)
48     ELSE ABS(T10.R - T1.R) END) != 1
49  AND CASE CHR(T9.R) WHEN 'A' THEN T1.R - T6.R + T5.R - T6.R ELSE 1 END != 0
50  AND CASE CHR(T9.R) WHEN 'A' THEN (T1.R - T6.R) * (T5.R - T6.R) ELSE 0 END = 0
51  AND CASE CHR(T9.R) WHEN 'B' THEN T1.R - T6.R + T5.R - T10.R ELSE 1 END != 0
52  AND CASE CHR(T9.R) WHEN 'B' THEN (T1.R - T6.R) * (T5.R - T10.R) ELSE 0 END = 0
53  AND CASE CHR(T9.R) WHEN 'C' THEN T1.R - T6.R + T5.R - T2.R ELSE 1 END != 0
54  AND CASE CHR(T9.R) WHEN 'C' THEN (T1.R - T6.R) * (T5.R - T2.R) ELSE 0 END = 0
55  AND CASE CHR(T9.R) WHEN 'D' THEN T1.R - T6.R + T5.R - T9.R ELSE 1 END != 0
56  AND CASE CHR(T9.R) WHEN 'D' THEN (T1.R - T6.R) * (T5.R - T9.R) ELSE 0 END = 0)
57  SELECT CHR(R1) R1, CHR(R2) R2, CHR(R3) R3, CHR(R4) R4, CHR(R5) R5,
58     CHR(R6) R6, CHR(R7) R7, CHR(R8) R8, CHR(R9) R9, CHR(R10) R10
59  FROM RESULT
60  WHERE (CASE CHR(R7) WHEN 'A' THEN C
61     WHEN 'B' THEN B
62     WHEN 'C' THEN A
63     ELSE D END) = LEAST(A, B, C, D)
64  AND (CASE CHR(R10) WHEN 'A' THEN 3
65     WHEN 'B' THEN 2
66     WHEN 'C' THEN 4
67     ELSE 1 END) = (GREATEST(A, B, C, D) - LEAST(A, B, C, D));
R1      R2      R3      R4      R5      R6      R7      R8      R9      R10
------- ------- ------- ------- ------- ------- ------- ------- ------- -------
B       C       A       C       A       C       D       A       B       A
这个SQL的主要逻辑是:
通过 WITH 构造 A、B、C、D 四个选项;
把十道题的所有选项可能性穷举生成;
按照题意通过 WHERE 语句来进行条件限制;
第三题和第九题都是一道题对应一个 WHERE 语句;
第七题和第十题无法在第一层查询中获取,需要在第二层中过滤。

虽然用了一点技巧,但是总的来说SQL的逻辑比较清楚,欢迎大家探讨不同解并投稿给我们。

我试着投了一个,公众号留言有字数限制,先发在这里:

with q as (select 'A' c FROM DUAL UNION ALL SELECT 'B' FROM DUAL UNION ALL SELECT 'C' FROM DUAL UNION ALL SELECT 'D' FROM DUAL)
,q2 as (
SELECT q1.c||q2.c||q3.c||q4.c||q5.c||q6.c||q7.c||q8.c||q9.c||q10.c s
      ,q7.c c7
      ,q10.c c10
  FROM q q1,q q2,q q3,q q4,q q5,q q6,q q7,q q8,q q9,q q10
WHERE q2.c||q5.c IN ('AC','BD','CA','DB')
       AND  q3.c = CASE WHEN q3.c NOT IN (q6.c,q2.c,q4.c) THEN 'A'
                        WHEN q6.c NOT IN (q3.c,q2.c,q4.c) THEN 'B'
                        WHEN q2.c NOT IN (q3.c,q6.c,q4.c) THEN 'C'
                        WHEN q4.c NOT IN (q3.c,q6.c,q2.c) THEN 'D'
                   END
       AND q4.c=CASE WHEN q1.c=q5.c THEN 'A'
                    WHEN q2.c=q7.c THEN 'B'
                    WHEN q1.c=q9.c THEN 'C'
                    WHEN q6.c=q10.c THEN 'D'
               END
       AND q5.c=DECODE(q5.c,q8.c,'A',q4.c,'B',q9.c,'C',q7.c,'D')
       AND q6.c=DECODE(q8.c||q8.c,q2.c||q4.c,'A',q1.c||q6.c,'B',q3.c||q10.c,'C',q5.c||q9.c,'D')
       AND ABS(DECODE(q8.c,'A',ASCII(q7.c)
                      ,'B',ASCII(q5.c)
                      ,'C',ASCII(q2.c)
                      ,'D',ASCII(q10.c)
                      )-ASCII(q1.c))<>1
       AND DECODE(q1.c,q6.c,1,-1) =- DECODE(DECODE(q9.c,'A',q6.c,'B',q10.c,'C',q2.c,'D',q9.c),q5.c,1,-1)
)
,q3 AS (SELECT q2.*,REGEXP_COUNT(s,'A') ca,REGEXP_COUNT(s,'B') cb,REGEXP_COUNT(s,'C') cc,REGEXP_COUNT(s,'D') cd FROM q2)
SELECT s
  FROM q3
WHERE c7=DECODE(LEAST(ca,cb,cc,cd),cc,'A',cb,'B',ca,'C',cd,'D')
       AND c10=DECODE(GREATEST(ca,cb,cc,cd)-LEAST(ca,cb,cc,cd),3,'A',2,'B',4,'C',1,'D')
;

S
----------

BCACACDABA





论坛徽章:
368
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2018-6-11 14:06 | 显示全部楼层
图片好模糊

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2018-6-11 20:14 来自手机 | 显示全部楼层
比原稿短很多,装修大师

使用道具 举报

回复
论坛徽章:
530
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2018-6-11 21:54 | 显示全部楼层
就是笛卡尔积然后再把每题用判断谓词表达出来。
如果人肉推理,可以从第三题入手。这道题隐含的意思是有2,3,4,6中有三题答案是一样的。提出假设之后再试错回溯。

使用道具 举报

回复
论坛徽章:
530
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2018-6-12 04:41 | 显示全部楼层
如果用1234取代ABCD,最后再变回来,那么中间有些逻辑判断可以用算术,代码就更简单:

with q as (select LEVEL c FROM DUAL CONNECT BY LEVEL<=4)
,q2 as (
SELECT q1.c||q2.c||q3.c||q4.c||q5.c||q6.c||q7.c||q8.c||q9.c||q10.c s
      ,q7.c c7
      ,q10.c c10
  FROM q q1,q q2,q q3,q q4,q q5,q q6,q q7,q q8,q q9,q q10
WHERE q2.c||q5.c IN ('13','24','31','42')
       AND  q3.c = CASE WHEN q3.c NOT IN (q6.c,q2.c,q4.c) THEN 1
                        WHEN q6.c NOT IN (q3.c,q2.c,q4.c) THEN 2
                        WHEN q2.c NOT IN (q3.c,q6.c,q4.c) THEN 3
                        WHEN q4.c NOT IN (q3.c,q6.c,q2.c) THEN 4
                   END
       AND DECODE(q4.c,1,q1.c-q5.c,2,q2.c-q7.c,3,q1.c-q9.c,4,q6.c-q10.c)=0
       AND q5.c=DECODE(q5.c,q8.c,1,q4.c,2,q9.c,3,q7.c,4)
       AND q6.c=DECODE(q8.c||q8.c,q2.c||q4.c,1,q1.c||q6.c,2,q3.c||q10.c,3,q5.c||q9.c,4)
       AND ABS(DECODE(q8.c,1,q7.c,2,q5.c,3,q2.c,4,q10.c)-q1.c)<>1
       AND DECODE(q1.c,q6.c,1,-1) =- DECODE(DECODE(q9.c,1,q6.c,2,q10.c,3,q2.c,4,q9.c),q5.c,1,-1)
)
,q3 AS (SELECT q2.*,REGEXP_COUNT(s,'1') ca,REGEXP_COUNT(s,'2') cb,REGEXP_COUNT(s,'3') cc,REGEXP_COUNT(s,'4') cd FROM q2)
SELECT TRANSLATE(s,'1234','ABCD')
  FROM q3
WHERE c7=DECODE(LEAST(ca,cb,cc,cd),cc,1,cb,2,ca,3,cd,4)
       AND c10=DECODE(GREATEST(ca,cb,cc,cd)-LEAST(ca,cb,cc,cd),3,1,2,2,4,3,1,4)
;


TRANSLATE(S,'1234','ABCD')
-------------------------------------
BCACACDABA

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2018-6-12 07:53 | 显示全部楼层
640.jpg

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2018-6-12 08:03 | 显示全部楼层
6401.jpg 6402.jpg
过滤不必要的数据对于提升SQL的性能非常重要,对于一个计算10000以内质数的SQL,未经优化前需要1分12秒的执行时间,消耗17万逻辑读。


通过严格的数据过滤,在运行的第一步消除不必要的数据,最终优化后的SQL只需要0.05秒,消耗461的逻辑读,执行时间和逻辑读都有几百倍的提升。

-----------
杨廷琨Oracle Code大会分享:如何编写高效SQL(含PPT)

使用道具 举报

回复
论坛徽章:
368
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2018-6-12 16:21 | 显示全部楼层
逻辑写法不够简洁,但比较清晰:

SQL> with t as (select chr(64+level) c from dual connect by level <=4),
  2       r as (select t1.c||t2.c||t3.c||t4.c||t5.c||t6.c||t7.c||t8.c||t9.c||t10.c ans,
  3                  t1.c a1,
  4            t2.c a2,
  5            t3.c a3,
  6            t4.c a4,
  7            t5.c a5,
  8            t6.c a6,
  9            t7.c a7,
10            t8.c a8,
11            t9.c a9,
12            t10.c a10
13             from t t1,t t2,t t3,t t4,t t5,t t6,t t7,t t8,t t9,t t10)
14  select ans
15    from r
16   where a2||a5 in ('AC','BD','CA','DB') --2
17     and a3 = case when a3 not in (a6,a2,a4) then 'A'
18                   when a6 not in (a3,a2,a4) then 'B'
19                   when a2 not in (a3,a6,a4) then 'C'
20                   when a4 not in (a3,a6,a2) then 'D'
21              end --3
22     and case when a4 = 'A' then ascii(a1)-ascii(a5)
23              when a4 = 'B' then ascii(a2)-ascii(a7)
24              when a4 = 'C' then ascii(a1)-ascii(a9)
25              when a4 = 'D' then ascii(a6)-ascii(a10)
26         end = 0 --4
27     and a5 = case when a5=a8 then 'A'
28                   when a5=a4 then 'B'
29                   when a5=a9 then 'C'
30                   when a5=a7 then 'D'
31              end --5
32     and a6 = case when a2=a4 and a4=a8 then 'A'
33                   when a1=a6 and a6=a8 then 'B'
34                   when a3=a10 and a10=a8 then 'C'
35                   when a5=a9 and a9=a8 then 'D'
36              end --6
37     and a7 = case when least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = regexp_count(ans,'C') then 'A'
38                   when least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = regexp_count(ans,'B') then 'B'
39                   when least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = regexp_count(ans,'A') then 'C'
40                   when least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = regexp_count(ans,'D') then 'D'
41              end --7
42     and a8 = case when abs(ascii(a1)-ascii(a7))>1 then 'A'
43                   when abs(ascii(a1)-ascii(a5))>1 then 'B'
44                   when abs(ascii(a1)-ascii(a2))>1 then 'C'
45                   when abs(ascii(a1)-ascii(a10))>1 then 'D'
46              end --8
47     and a9 = case when (a1=a6 and a6  != a5 or a1!=a6 and a6  = a5) then 'A'
48                   when (a1=a6 and a10 != a5 or a1!=a6 and a10 = a5) then 'B'
49                   when (a1=a6 and a2  != a5 or a1!=a6 and a2  = a5) then 'C'
50                   when (a1=a6 and a9  != a5 or a1!=a6 and a9  = a5) then 'D'
51              end --9
52     and a10 = case when greatest(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D'))
53                         - least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = 3 then 'A'
54                    when greatest(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D'))
55                         - least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = 2 then 'B'
56                    when greatest(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D'))
57                         - least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = 4 then 'C'
58                    when greatest(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D'))
59                         - least(regexp_count(ans,'A'),regexp_count(ans,'B'),regexp_count(ans,'C'),regexp_count(ans,'D')) = 1 then 'D'
60               end --10
61  /
ANS
--------------------
BCACACDABA

使用道具 举报

回复
论坛徽章:
530
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2018-6-12 23:51 | 显示全部楼层
solomon_007 发表于 2018-6-12 16:21
逻辑写法不够简洁,但比较清晰:

SQL> with t as (select chr(64+level) c from dual connect by level  ...

CASE的可读性要比DECODE强,代码量相应也就较多。
regexp_count用了很多次,这也是为什么我要多写一层。

使用道具 举报

回复
论坛徽章:
368
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2018-6-13 09:15 | 显示全部楼层
newkid 发表于 2018-6-12 23:51
CASE的可读性要比DECODE强,代码量相应也就较多。
regexp_count用了很多次,这也是为什么我要多写一层。

简洁高效你的写法是我们学习的范本

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表