我想知道是否有人可以帮助我使用 SQL 按字母顺序对
Category
列进行排序。
让我解释一下:我继承了一个数据库来对我所有的书籍进行编目。在数据库中,我有一个名为
BOOKS
的表。
BOOKS
表包含许多列,但我尝试重新排序的列称为 Categories
。
在此表中,每个新行(从 LINEID=1 开始)包含我收藏的一本书的名称;加上我需要的关于这本书的所有详细信息等。目前有 500 多行(超过 500 个 ROWID)。我需要按此列对每个 LINEID 而不是整个表进行排序。
Categories
列中的每个新行都是数据类型TEXT
,它可以在方括号之间保存多个文本条目(我没有这样设计)。但是,如果我要输入新书的详细信息,我可以为每本书添加任意数量的用户定义“类别”,只要它们位于用逗号分隔的双引号之间。例如:
[ "Books - Hardback","Books - Read","Books - WWII","John Kenneally","Leslie Jackson","Irish Guards","Anzio","The Tunisian Campaign","Italy","Autobiography","Books - War","Desertion","Lee Enfield" ]
[ "Books - Hardback","Books - Read","Books - WWII","Airman","RAF","USAF","Burma","C47 Dakota","Flying Tigers","Indo-China","Lee Crane","P40 Tomahawk","Pilots","Robert Ryan" ]
正如您所看到的每个“双括号”,条目并不是按字母顺序排列的。我希望 SQL 查询将每个
,
""
按字母顺序按单词的第一个字母或第一个单词(如果有多个单词)分隔。我可以根据需要手动添加或修改类别。但 500 多行中的大多数目前并未按字母顺序排列,这是我的偏好。
以下查询不会引发错误,但不会对条目进行排序。
SELECT Categories
FROM BOOK
ORDER BY substr(Categories, instr(Categories, ',"') + 2, instr(Categories || ',"', '","') - instr(Categories, ',"') - 2) ASC;
我想知道是否有人可以建议使用标准 SQL 的更好方法。我目前使用的是 SQLite 版本 3.4.4。现在我已经退休了。
提前谢谢您。
扇火
我不确定我是否准确理解您需要什么,但我将示例的两条记录和 ID 存储在我称为 books 的表中。然后我尝试了这样的查询
WITH RECURSIVE split(id, categories, str) AS (
SELECT id, '', categories||',' FROM books
UNION ALL SELECT
id,
substr(str, 0, instr(str, ',')),
substr(str, instr(str, ',')+1)
FROM split WHERE str!=''
)
,tab as (SELECT id, rtrim(ltrim(replace(replace(categories,'[',''),']',''))) as categories
FROM split
WHERE categories!='')
SELECT id,'['||group_concat(categories)||']' as categories
FROM (select * from tab order by categories asc)
GROUP BY id
第一个 cte 将列类别分成多行; “新”类别的每个值都是“”之间的字符串之一。 第二个 cte 只是替换一些在订购时可能出现问题的字符(在本例中为空格和括号)。 最后,我使用 group_concat 函数按 id 分组来获取两行,其中列类别包含按字母顺序排列的值 orbere。我不确定子查询中的 order by 是最好的解决方案,但它似乎有效。