如何在 SQLite 中按字母顺序对字符串字段中的字符进行排序? (“推箱子”--->“abknoos”)

问题描述 投票:0回答:1

如何对 SQLite 数据库中的字符串值中的字符进行排序? 例如:

"macedonia" --sorted--> "aacdeimno"?

我知道一种方法:如果我使用另一个表:integers(i int) (1,2,3,4,,,,,100) 并进行以下查询:

SELECT group_concat(l ,''  )
FROM 
  ( SELECT substr('macedonia',i,1) as l 
    from  integers 
    where i BETWEEN 1 and length('macedonia') 
    ORDER BY l 
  )

-- 排序作品! --> '马其顿'---> 'aacdeimno'

但是如果我在其他复杂查询中使用它,这个方法就太复杂了! 如何传递字符串“macedonia”作为查询的参数?在 MS Access 中,有所谓的参数查询...

你知道更简单的事情吗?也许使用 CTE 或 REGEXP ? 对于 PostgreSQL 数据库,我编写了自己的函数 psrt() 来对 PL/pgSQL 语言中的字符串进行排序。 SQLite有这样的SORTING功能吗?

string sqlite sorting alphabetical-sort
1个回答
0
投票

也许考虑以下基于递归 CTE 的示例:-

DROP TABLE IF EXISTS demo;
CREATE TABLE IF NOT EXISTS demo (s TEXT);
/* Load some test data */
INSERT INTO demo VALUES
    (''),('macedonia'),('blah'),('rumplestiltskin'),('something'),(100),(null);
/* Show loaded data */
SELECT rowid,* FROM demo;

/* The reordering via CTEs */
WITH cte1(r,current,rest) AS (
    SELECT rowid,substr(s,1,1), substr(s,2) FROM demo
    UNION ALL 
        SELECT r,substr(rest,1,1),substr(rest,2) 
        FROM cte1 
        WHERE length(rest) > 0
        LIMIT 50
),
cte2 AS (SELECT * FROM cte1 ORDER BY r,current)
SELECT r,group_concat(current,'') FROM cte2 GROUP BY r
;
/* Cleanup demo environment */
DROP TABLE IF EXISTS demo;

输出:-

  1. 原始数据为,和
  2. 重新排序为
  • 注意 rowid 在没有主键的情况下使用,将每个单独的字母/字符与其所在的行联系起来。显然不适用于
    WITHOUT ROWID
    表,但可以进行调整以利用主键。
© www.soinside.com 2019 - 2024. All rights reserved.