sqlzoo 'select from world' 教程的第 13 部分的解决方案是什么?

What is the solution to 13th part of 'select from world' tutorial on sqlzoo?

problem statement是:

Put the continents right...

  • Oceania becomes Australasia
  • Countries in Eurasia and Turkey go to Europe/Asia
  • Caribbean islands starting with 'B' go to North America, other Caribbean islands go to South America

Show the name, the original continent and the new continent of all countries.

我的解决方案:

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 得到的结果是 "Wrong answer. Some of the data is incorrect."。

这对我有用。不要问我为什么必须使用 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

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

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

如果您添加 "order by name",它会给出上述查询的正确答案。但是,如果您不包含订单,则将其标记为不正确。至于为什么我不确定。

这也行。对土耳其使用 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

我试过了,对土耳其使用 'OR' 而不是发表新声明无济于事。 同意这是不正确的,可能是页面 sqlzoo.

的错误

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

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

顺序应该无关紧要,但网站的回答(当您回答错误时)建议输出应按国家/地区名称排序。

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;

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

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;