这是参考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
答案 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中的两个城市,以及它们各自的长度(即:名称中的字符数)。如果有多个最小或最大的城市,请选择按字母顺序排序的第一个城市。
在提交框中有一条评论:
请附加分号“;”在查询结束时,在一行中输入您的查询以避免错误。
所以,你有几个错误:
WHERE ROWNUM = 1
来获取最短和最长的名称,然后使用UNION
(或UNION ALL
)合并它们或单个查询使用ROW_NUMBER()
分析函数。