解码Oracle SQL中的多行和多列



我有一个表(详细信息)-

tbody> <<tr>BC
Name(primary key) color shading available
YNN
NYY
NNN

SQL查询时,每一行分别选择威胁(大多数情况下),因此CASE,DECODE和其他函数和表达式将一次处理一行。

你,据我所知,想分析表作为一个整体。这似乎不是SQL的任务,但您可以"破解"。你的出路。

可以一次分析一行,然后计算整个表的输出。

这里查询:

  1. 根据列中的值为行分配优先级,
  2. 获得最大行优先级,
  3. 将该最大值解码为所需字符串。
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
)

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

对于这个用例,您可以使用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;

最新更新