在postgresql中使用CASE语句

时间:2017-09-16 05:42:22

标签: ruby postgresql

select *,'example' AS species 
from top_half 
inner join bottom_half 
on top_half.id = bottom_half.id 
order by species(
    CASE
       WHEN heads > arms THEN species.example = 'beast'
       when  tails > legs then species.example = 'beast'
       else species.example = 'weirdo'
    END
);

我收到以下错误:

SQL查询出错:

  

PG :: UndefinedTable:错误:缺少表的FROM子句条目   “物种”第2行:当头部>武器那么species.example ='野兽'   SQL查询出错:

     

PG :: UndefinedTable:错误:缺少表的FROM子句条目   “物种”第2行:当头部> arm THEN species.example ='beast'

如何解决这个问题?

codewars.com/kata/sql-basics-monsters-using-case/train/sql

我正在尝试解决上面链接中的问题

  

说明

     

您可以访问名为top_half和bottom_half的两个表   如下:

     

top_half架构

     
      
  • id
  •   
  • 负责人
  •   
  • arms
  •   
     

bottom_half架构

     
      
  • id
  •   
  • leg
  •   
  • tails
  •   
     

您必须返回一个格式如下的表格:

     

输出架构

     
      
  • id
  •   
  • 负责人
  •   
  • leg
  •   
  • arms
  •   
  • tails
  •   
  •   
     

表格上的ID匹配   完整的怪物。对于头部,手臂,腿部和尾部,您需要画入   来自每个表的数据。

     

对于物种,如果怪物的头部多于武器和/或更多   尾巴比腿,它是'野兽',否则它是'WEIRDO'。这需要   在物种专栏中被捕获。

     

应返回所有行(10)。

     

测试需要使用CASE。按物种排序。

     

请使用纯SQL,只在Ruby中进行测试。

3 个答案:

答案 0 :(得分:1)

  

对于物种,如果怪物的头部多于武器和/或更多   尾巴比腿,它是一个'野兽'否则它就是一个' WEIRDO'。这需要   在物种专栏中被捕获。

您需要将CASE ... WHEN移动到SELECT子句。:

select *,
       CASE
          WHEN heads > arms THEN 'beast'
          when tails > legs then 'beast'
          else 'weirdo'
       END    As Species
from top_half 
inner join ....
.....
  

测试需要使用CASE。按物种排序。

使用此条款:

....
ORDER BY species

或者这个:

.......
ORDER BY 
       CASE
          WHEN heads > arms THEN 'beast'
          when tails > legs then 'beast'
          else 'weirdo'
       END

答案 1 :(得分:1)

合并:

SELECT *, CASE WHEN heads > arms OR tails > legs THEN text 'BEAST'
               ELSE 'WEIRDO' END AS species
FORM   top_half 
JOIN   bottom_half USING (id)
ORDER  BY species;

答案 2 :(得分:0)

select t.id,t.heads, b.legs,t.arms,b.tails,
CASE 
     WHEN t.heads > t.arms THEN 'BEAST'
     WHEN b.tails > b.legs THEN 'BEAST'
     ELSE  'WEIRDO'

   END as species

from top_half t
join bottom_half b
ON t.id = b.id
ORDER BY species