sqlite SQL排序依据、按大小写排序、何时、项目到特定位置

hts6caw3  于 2023-02-13  发布在  SQLite
关注(0)|答案(1)|浏览(159)

如何把物品放在特定的位置?
我想把项目放在第5个位置:

`id`='randomId243'

到目前为止,我的排序如下所示:

ORDER BY
    CASE
        WHEN `id` = 'randomId123' THEN 0
        WHEN `id` = 'randomId098' THEN 1
        ELSE 2
    END, `name` ASC

我还不知道哪个id将位于位置2、3、4。我希望避免运行另一个查询/子查询来获取位置2-4的项的id
所以最后的顺序应该是这样的:

  • 随机ID 123
  • 随机ID 098
  • 仅按字母顺序排列项目
  • 仅按字母顺序排列项目
  • 仅按字母顺序排列项目
  • 随机ID 243
  • 仅按字母顺序排列项目
yhxst69z

yhxst69z1#

对当前排序使用ROW_NUMBER()窗口函数对行进行初始排序。
然后创建3组行:顶部的行、'item5'的行和'item5'以下的行将与UNION ALL组合并按组和行号排序:

WITH cte AS (
    SELECT *, 
           ROW_NUMBER() OVER (ORDER BY CASE id WHEN 'item0' THEN 0 WHEN 'item1' THEN 1 ELSE 2 END, name) AS rn
    FROM tablename
)  
SELECT id, name
FROM (
  SELECT * FROM (SELECT *, 1 grp FROM cte WHERE id <> 'item5' ORDER BY rn LIMIT 5)
  UNION ALL
  SELECT *, 2 FROM cte WHERE id = 'item5'
  UNION ALL
  SELECT * FROM (SELECT *, 3 FROM cte WHERE id <> 'item5' ORDER BY rn LIMIT -1 OFFSET 5) -- negative limit means there is no limit
)
ORDER BY grp, rn;

请注意,代替:

ORDER BY CASE id WHEN 'item0' THEN 0 WHEN 'item1' THEN 1 ELSE 2 END, name

您可以用途:

ORDER BY id = 'item0' DESC, id = 'item1' DESC, name

参见简化的demo

相关问题