Oracle SQL中多行多列的解码

oyt4ldly  于 2023-04-05  发布在  Oracle
关注(0)|答案(3)|浏览(185)

我有一张table(详情)-
| 名称(主键)|颜色|阴影|可用|
| --------------|--------------|--------------|--------------|
| A|是|N|N|
| B|N|是|是|
| C|N|N|N|
现在,我需要一个查询,它可以对每条记录逐个检查行和列。

if color = "Y" then output = "ABC"
if color = "N" and shading = "Y" then output = "XYZ"
if color = "N" and shading = "N" and available = "Y" then output = "Hurray!"

列的优先级是- color〉shading〉available所以,如果color =“Y”,我们就不需要查看其他3列,并给予输出作为“ABC”。它应该检查所有行的输出值,并最终根据优先级只给予仅一个输出。优先级如下- ABC〉XYZ〉Hurray!即如果3行中的任何一行给出输出为“ABC”但如果两行输出“Hurray!”,一行输出“XYZ”,则最终输出应为“XYZ”。
我试着用解码器。

SELECT DECODE (color,'Y','ABC') AS RESULT_color,
DECODE (shading,'Y','XYZ') AS RESULT_shade,
DECODE (available,'Y','Hurray!') AS RESULT_available from details;

但这是错误的,因为当我想一起检查所有列和所有行时,它一次只考虑一列和一行。

fjnneemd

fjnneemd1#

SQL查询,同时单独选择每行的威胁(大多数情况下),因此CASEDECODE和其他函数和表达式将一次处理一行。
据我所知,你想把表作为一个整体来分析,这似乎不是SQL的任务,但你可以“破解”你的方法。
您可以一次分析一行,然后计算整个表的输出。
此处查询:
1.基于列中的值向行分配优先级,
1.获取行的最大优先级,
1.将该最大值解码成期望的字符串。

select
    DECODE (max(priority),
        3, 'ABC',
        2, 'XYZ',
        1, 'Hurray!',
        'BAD!')
from (
    select
        CASE
            WHEN (color = 'Y') THEN 3
            WHEN (
                color = 'N'
                AND shading = 'Y'
            ) THEN 2
            WHEN (
                color = 'N'
                AND shading = 'N'
                AND available = 'Y'
            ) THEN 1
            ELSE 0
        END priority
    from details
)
3df52oht

3df52oht2#

使用CASE而不是DECODE。当你有一个简单的等式或不等式选择,并且你想要有简洁,干净的代码时,DECODE是很好的选择。但是任何比这更复杂的东西,你可以用CASE处理得更好。像大多数语言中的CASE实现一样,在SQL中,它将按照测试条件的顺序进行评估,所以你可以简单地通过WHEN子句的顺序来控制优先级:

SELECT x.*,
       CASE WHEN (color = 'Y') THEN 'ABC'
            WHEN (color = 'N' AND shading = 'Y') THEN 'XYZ'
            WHEN (color = 'N' AND shading = 'N' AND available = 'Y') THEN 'Hurray!'
       END output
  FROM table x
ffscu2ro

ffscu2ro3#

你可以在这个用例中使用CASE语句。对于你的问题,尝试使用这个代码片段。

SELECT 
    CASE
        WHEN 'ABC' IN (
            SELECT
                CASE
                    WHEN color = 'Y' THEN 'ABC'
                    WHEN color = 'N' AND shading = 'Y' THEN 'XYZ'
                    WHEN color = 'N' AND shading = 'N' AND available = 'Y' THEN 'Hurray!'
                END
            FROM details) THEN 'ABC'
        WHEN 'XYZ' IN (
            SELECT
                CASE
                    WHEN color = 'Y' THEN 'ABC'
                    WHEN color = 'N' AND shading = 'Y' THEN 'XYZ'
                    WHEN color = 'N' AND shading = 'N' AND available = 'Y' THEN 'Hurray!'
                END
            FROM details) THEN 'XYZ'
        ELSE 'Hurray!'
    END
FROM details;

相关问题