无法根据字符串的长度对表中的结果进行排序

时间:2016-12-15 08:03:26

标签: sql oracle

这是参考hackerRank problem。我面临着一个奇怪的问题。我无法对SQL查询的输出进行排序:

set([<ProductClass: accessories>, <ProductClass: other>]) is not JSON serializable

所需的输出应为:

SELECT CITY, LENGTH(CITY) AS LEN FROM STATION 
WHERE
LENGTH(CITY) IN (
(SELECT MIN(LENGTH(CITY)) FROM STATION),
(SELECT MAX(LENGTH(CITY)) FROM STATION))
ORDER BY TO_NUMBER(LEN) ASC;

然而,我得到以下输出:

Amo 3 
Lee 3  
Roy 3
Marine On Saint Croix 21 

4 个答案:

答案 0 :(得分:1)

代码不干净,但逻辑上很好。
我可以考虑两个选项。

1)并非正在执行整个查询。省略了order by子句。
2)在执行环境中正在进行另外的排序。

谨慎分享您如何执行此代码?

答案 1 :(得分:0)

问题是HackerRank环境,而不是您的查询。

如果您尝试在Oracle Live SQL上运行它,那就可以了。

ORDER BY TO_NUMBER(LEN)更改为ORDER BY LEN将是一种优化

答案 2 :(得分:0)

您要为列添加别名,并在语句的同一级别对其进行排序。我需要像这样重写它:

SELECT CITY, LENGTH(CITY) AS LEN FROM STATION 
WHERE
LENGTH(CITY) IN (
(SELECT MIN(LENGTH(CITY)) FROM STATION),
(SELECT MAX(LENGTH(CITY)) FROM STATION))
ORDER BY LENGTH(CITY) ASC;

或者你也可以这样包装语句:

SELECT * 
  FROM (SELECT CITY, LENGTH(CITY) AS LEN FROM STATION 
         WHERE LENGTH(CITY) IN (
                 (SELECT MIN(LENGTH(CITY)) FROM STATION),
                 (SELECT MAX(LENGTH(CITY)) FROM STATION))) t
ORDER BY t.LEN ASC;

答案 3 :(得分:0)

问题是:

  

使用最短和最长的CITY名称查询STATION中的两个城市,以及它们各自的长度(即:名称中的字符数)。如果有多个最小或最大的城市,请选择按字母顺序排序的第一个城市。

在提交框中有一条评论:

  

请附加分号“;”在查询结束时,在一行中输入您的查询以避免错误。

所以,你有几个错误:

  1. 您想要的输出实际上不是问题的理想输出(您返回太多行,因为您只需要一个最短的城市名称和一个最长的城市名称,如果长度有关系,则按字母顺序排在第一位。)< / LI>
  2. 您需要确保代码全部在一行上(而不是您在此处发布的多行)。
  3. 您应该考虑使用两个查询,每个查询分别使用WHERE ROWNUM = 1来获取最短和最长的名称,然后使用UNION(或UNION ALL)合并它们或单个查询使用ROW_NUMBER()分析函数。