SQLite/Room ORDER BY 与 CASE 语句会忽略列 COLLATE

标签 sqlite sql-order-by case android-room collation

关于CASE,我有些不明白的地方ORDER BY 中的声明使用 SQLite 的子句(最初我将它与 Android Room 一起使用,但它并不特定于此)。

这是问题的精炼。查询 1 返回我所期望的内容(不区分大小写的有序列表)。而查询 2 似乎忽略了列的 COLLATE NOCASE。这是为什么?

谢谢!

架构 (SQLite v3.30)

CREATE TABLE "test" (
    "id"    INTEGER,
    "stuff" TEXT COLLATE NOCASE,
    PRIMARY KEY("id" AUTOINCREMENT)
);

INSERT INTO test (stuff) VALUES ("0");
INSERT INTO test (stuff) VALUES ("a");
INSERT INTO test (stuff) VALUES ("z");
INSERT INTO test (stuff) VALUES ("A");
INSERT INTO test (stuff) VALUES ("Z");

查询#1

SELECT *
FROM test
ORDER BY
    stuff ASC;
<表类=“s-表”> <标题> id 东西 <正文> 1 0 2 一个 4 一个 3 z 5 Z

查询#2

SELECT * 
FROM test
ORDER BY 
    CASE WHEN true THEN stuff END ASC;
<表类=“s-表”> <标题> id 东西 <正文> 1 0 4 一个 5 Z 2 一个 3 z

View on DB Fiddle

最佳答案

任何 CASE expression 的结果是一个表达式,即使它的返回值是对像THEN stuff这样的列的简单引用。
对于此返回的表达式,没有显式定义 Collating Sequence ,因此为了进行 ORDER BY 子句比较,所使用的整理顺序是 BINARY

如果 ORDER BY 子句只是:

,也会发生同样的情况
ORDER BY stuff || '' ASC

上面的表达式东西|| '' 仅返回列 stuff 的值,但它仍然被视为表达式,并且 BINARY 整理序列将为使用过。

如果要将特定的整理序列应用于 CASE 表达式的结果,则必须在 ORDER BY 子句中显式使用它:

SELECT * 
FROM test 
ORDER BY CASE WHEN true THEN stuff END COLLATE NOCASE ASC;

请参阅demo .

关于SQLite/Room ORDER BY 与 CASE 语句会忽略列 COLLATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71326935/

相关文章:

sql - SQL:选择至少一行具有特定值的不同“类别”

mysql - 更新排序索引列以移动项目

mysql - "ORDER BY ' column_name ' DESC",但是字母前的数字需要两个语句?

string - 字符串第一个字符的大小写

MySQL 计算每个成员子类型每小时的签到次数

sql - 我可以在sql中进行两次分组吗?

iphone - 我们可以为 Core Data 使用两个具有相同表的 sqlite 数据库的联合吗?

java - SQLite JDBC Connection.preparedStatement 中的 NullPointerException

ios - 在iOS问题中打开SQLite文件

Postgresql:按分区键排序的查询