关于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;
查询#2
SELECT *
FROM test
ORDER BY
CASE WHEN true THEN stuff END ASC;
最佳答案
任何 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/