【问题标题】:What is the solution to 13th part of 'select from world' tutorial on sqlzoo?sqlzoo上“从世界中选择”教程第13部分的解决方案是什么?
【发布时间】:2015-05-12 15:41:36
【问题描述】:

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 得到的结果是“错误答案。某些数据不正确。”。

【问题讨论】:

  • 问题是Eurasia,你的答案是IN ('Europe', 'Asia')。就个人而言,我不认为土耳其包含任何国家。
  • 我同意@jodrell 的观点(试图预测 sqlzoo 预期的正确答案...)好消息是您的 SQL 是 100% 可靠的,问题在于您卡住的字符串sqlzoo 不喜欢的地方。
  • @Jodrell,我现在试过了,但它也不起作用。原始表不应该在大陆列中包含“欧亚大陆”。
  • 我怀疑规范不明确,因此造成混淆。
  • @systemovich:不过它确实包含欧亚大陆。试试这个看看他们:SELECT name, continent FROM world where continent='Eurasia'

标签: sql case sql-like case-when


【解决方案1】:

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

【讨论】:

  • 是的,看起来数据集确实包含Eurasia,所以这是正确的。我不认为 ORDER BY 是必要的,因为这纠正了 OPs 答案中的Eurasia 问题。
  • ORDER BY 是使网站正常运行所必需的,而不是回答对问题的这种解释。
【解决方案2】:

除非我读错了问题,否则这似乎是他们系统中的一个错误:

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

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

【讨论】:

    【解决方案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;
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        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;
        

        【讨论】:

          【解决方案6】:

          我试过了,在土耳其使用'OR' 而不是做出新的声明将无济于事。 同意这是不正确的,可能是页面sqlzoo的错误。

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

          并且列的名称并不重要,您可以将它们命名为“YouLikeItToBe”。 所以很明显,sqlzoo 会检查表中的内容、计数和顺序,但是不会保持顺序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-11
            • 2014-04-08
            • 2018-03-26
            • 2018-04-02
            • 1970-01-01
            • 2013-07-03
            • 2019-03-09
            • 1970-01-01
            相关资源
            最近更新 更多