带有大小写的案例的SQL请求“(1)第一个ORDER BY术语与结果集中的任何列都不匹配”

时间:2014-01-19 22:11:21

标签: android sql sqlite

我对SQL游标有一个小问题。 我正在尝试在android上执行SQL命令。我试图按案例对返回的内容进行排序,但似乎系统不接受返回的值(?!) 我已经尝试了一切!你有解决方案吗? ;)

cursor = db.rawQuery(c, null);
String c = "SELECT * FROM characters WHERE UPPER(descriptions) LIKE '%" + 
    TextUtils.join("%", arr) + "%' UNION ALL SELECT * FROM words WHERE
    UPPER(descriptions) LIKE '%" + TextUtils.join("%", arr) + "%'
    ORDER BY CASE WHEN UPPER(descriptions) LIKE '" + s + "' THEN 1
    WHEN UPPER(descriptions) LIKE '" + s + "|%' THEN 2 WHEN
    UPPER(descriptions) LIKE '%|" + s + "|%' THEN 2 WHEN UPPER(descriptions)
    LIKE '%|" + s + "' THEN 2 WHEN UPPER(descriptions)
    LIKE '%" + TextUtils.join(" ", arr) + "%' THEN 3 ELSE 4 END, descriptions ASC";

我是否需要像这样对命令进行排序?

SELECT * FROM characters WHERE UPPER(descriptions) LIKE '%" + TextUtils.join("%", arr) + "%' 
UNION ALL
SELECT * FROM words WHERE UPPER(descriptions) LIKE '%" + TextUtils.join("%", arr) + "%'                                     
ORDER BY
    CASE
        WHEN UPPER(descriptions) LIKE '" + s + "' THEN 1          
        WHEN UPPER(descriptions) LIKE '" + s + "|%' THEN 2 
        WHEN UPPER(descriptions) LIKE '%|" + s + "|%' THEN 2 
        WHEN UPPER(descriptions) LIKE '%|" + s + "' THEN 2 
        WHEN UPPER(descriptions) LIKE '%" + TextUtils.join(" ", arr) + "%' THEN 3 
        ELSE 4 
    END,
descriptions ASC

谢谢;)

编辑: 插入搜索词“a test”后的SQL命令

SELECT * FROM characters WHERE UPPER(descriptions) LIKE '%A%TEST%'
UNION ALL
SELECT * FROM words WHERE UPPER(descriptions) LIKE '%A%TEST%'
ORDER BY
    CASE
        WHEN UPPER(descriptions) LIKE 'A TEST' THEN 1
        WHEN UPPER(descriptions) LIKE 'A TEST|%' THEN 2
        WHEN UPPER(descriptions) LIKE '%|A TEST|%' THEN 2
        WHEN UPPER(descriptions) LIKE '%|A TEST' THEN 2
        WHEN UPPER(descriptions) LIKE '%A TEST%' THEN 3
        ELSE 4
    END,
descriptions ASC

表架构:

characters (t TEXT,s TEXT,jy TEXT,descriptions TEXT)
words (t TEXT,s TEXT,jy TEXT,descriptions TEXT)

3 个答案:

答案 0 :(得分:5)

当您从单个表中选择记录时,您可以使用这些记录中的任何内容进行排序。

但是,当您使用UNION组合多个查询时,将对整个结果进行排序,因此您必须使用结果中的某些列进行排序。 在这种情况下,这意味着您必须将计算移动到查询本身:

SELECT t, s, jy, descriptions, CASE ... END AS ordernr FROM ...
UNION ALL
SELECT t, s, jy, descriptions, CASE ... END AS ordernr FROM ...
ORDER BY ordernr,
         descriptions

答案 1 :(得分:0)

请参阅this post并尝试在select语句中指定所有列。

答案 2 :(得分:0)

真正的原因似乎here :

<块引用>

在标准 SQL 中,ORDER BY 子句必须是 (1) 一个正数 整数,表示按相应列排序或 (2) 精确副本 定义列的表达式之一。 ORDER BY 可能不 在标准 SQL 中具有任意表达式。许多 RDBMS(包括 SQLite) 扩展它,以便您可以在 ORDER BY 子句,但在 UNION 查询的情况下,该增强 不适用(由于技术原因)和原始标准-SQL 限制生效。