sqlzoo上“从世界中选择”教程的第13部分有什么解决方案?

时间:2015-05-12 15:41:37

标签: sql case sql-like case-when

problem statement是:

  

把各大洲放在正确的位置......

     
      
  • 大洋洲成为澳大拉西亚
  •   
  • 欧亚大陆和土耳其的国家访问欧洲/亚洲
  •   
  • 以'B'开头的加勒比群岛前往北美洲,其他加勒比岛屿前往南美洲
  •   
     

显示所有名称,原始大陆和新大陆   国家。

我的解决方案:

SELECT name, continent,
   CASE WHEN continent='Oceania' THEN 'Australasia'
        WHEN continent IN ('Europe', 'Asia') THEN 'Europe/Asia'
        WHEN name='Turkey' THEN 'Europe/Asia'
        WHEN continent='Caribbean' AND name LIKE 'B%' THEN 'North America'
        WHEN continent='Caribbean' AND name NOT LIKE 'B%' THEN 'South America'
        ELSE continent END
FROM world

我从sqlzoo得到的结果是“错误答案。有些数据不正确。”。

6 个答案:

答案 0 :(得分:10)

这对我有用。不要问我为什么必须使用ORDER BY(没有它就没有用)。

SELECT name, continent,
   CASE WHEN continent='Oceania' THEN 'Australasia'
        WHEN continent =  'Eurasia' THEN 'Europe/Asia'
        WHEN name='Turkey' THEN 'Europe/Asia'
        WHEN continent='Caribbean' AND name LIKE 'B%' THEN 'North America'
        WHEN continent='Caribbean' AND name NOT LIKE 'B%' THEN 'South America'
        ELSE continent END
FROM world ORDER BY name

答案 1 :(得分:3)

看起来是他们系统中的一个错误,除非我读错了这个问题:

SELECT name, continent,
CASE WHEN continent='Oceania' THEN 'Australasia'
        WHEN continent IN ('Eurasia') THEN 'Europe/Asia'
        WHEN name='Turkey' THEN 'Europe/Asia'
        WHEN continent='Caribbean' AND name LIKE 'B%' THEN 'North America'
        WHEN continent='Caribbean' AND name NOT LIKE 'B%' THEN 'South America'
        ELSE continent END
FROM world
order by name

如果您按“名称顺序”添加,则会使用上述查询给出正确答案。但是,如果您不包含订单,则将其标记为不正确。至于为什么我不确定。

答案 2 :(得分:3)

以下代码可以解决您的问题:

SELECT name AS Country, continent as Continent,
   CASE WHEN continent='Oceania' THEN 'Australasia'
        WHEN continent = 'Eurasia' THEN 'Europe/Asia'
WHEN name='Turkey' THEN 'Europe/Asia'
        WHEN continent='Caribbean' AND name LIKE 'B%' THEN 'North America'
        WHEN continent='Caribbean' AND name NOT LIKE 'B%' THEN 'South America'
        ELSE continent END AS "New Continent"
FROM world
WHERE tld IN ('.ag','.ba','.bb','.ca','.cn','.nz','.ru','.tr','.uk')
ORDER BY Country;

答案 3 :(得分:2)

这也有效。使用土耳其的OR语句并重命名为新列

SELECT name,continent,
CASE 
WHEN continent='Oceania' THEN 'Australasia'
WHEN continent='Eurasia' OR name = 'Turkey' THEN 'Europe/Asia'
WHEN continent='Caribbean' AND name LIKE 'B%' THEN 'North America'
WHEN continent='Caribbean' AND name NOT LIKE 'B%' THEN 'South America'
ELSE continent 
END as 'new continent name'
FROM world 
ORDER BY name

答案 4 :(得分:2)

订单无关紧要,但网站的答案(当您回答错误时)表明输出应按国家/地区名称排序。

SELECT name AS Country, continent as Continent,
   CASE WHEN continent='Oceania' THEN 'Australasia'
        WHEN continent IN ('Eurasia', 'Turkey') THEN 'Europe/Asia'
        WHEN continent='Caribbean' AND name LIKE 'B%' THEN 'North America'
        WHEN continent='Caribbean' AND name NOT LIKE 'B%' THEN 'South America'
        ELSE continent END AS "New Continent"
FROM world
ORDER BY Country;

答案 5 :(得分:1)

我尝试过,并且使用'OR'代替土耳其而不是制作新的声明并不会帮助自己。 同意这不正确,可能是页面sqlzoo的错误。

但与'ORDER BY name'一起使用时,两种方式都是正确的。

列的名称并不重要,您可以将它们命名为YouLikeItToBe'。 很明显,sqlzoo会检查表中的内容,计数以及它的顺序,但是,不会保留顺序。