我有一张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;
但这是错误的,因为当我想一起检查所有列和所有行时,它一次只考虑一列和一行。
3条答案
按热度按时间fjnneemd1#
SQL查询,同时单独选择每行的威胁(大多数情况下),因此
CASE
,DECODE
和其他函数和表达式将一次处理一行。据我所知,你想把表作为一个整体来分析,这似乎不是SQL的任务,但你可以“破解”你的方法。
您可以一次分析一行,然后计算整个表的输出。
此处查询:
1.基于列中的值向行分配优先级,
1.获取行的最大优先级,
1.将该最大值解码成期望的字符串。
3df52oht2#
使用
CASE
而不是DECODE
。当你有一个简单的等式或不等式选择,并且你想要有简洁,干净的代码时,DECODE
是很好的选择。但是任何比这更复杂的东西,你可以用CASE
处理得更好。像大多数语言中的CASE
实现一样,在SQL中,它将按照测试条件的顺序进行评估,所以你可以简单地通过WHEN
子句的顺序来控制优先级:ffscu2ro3#
你可以在这个用例中使用CASE语句。对于你的问题,尝试使用这个代码片段。