【问题标题】:SQLite: order so that results with same starting letter would come first?SQLite:排序以便具有相同首字母的结果首先出现?
【发布时间】:2014-07-03 12:32:17
【问题描述】:

SQLite 3.7.11

鉴于我在 SQLITE 表中有这两条记录,字段名为 name:
预览
查看

如果我运行查询:

SELECT * FROM table WHERE name LIKE "%" + $keyword + "%" ORDER BY name

$keyword 设置为“vi

我会按以下顺序得到结果:
1)“预览”
2)“视图”

有没有办法让第一个字母与关键字的第一个字母(在本例中为“v”)相同的名称排在第一位?

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    您可以按关键字在搜索字符串中的位置进行排序

    SELECT * FROM your_table
    WHERE name LIKE concat('%', '$keyword', '%')
    ORDER BY POSITION('$keyword' IN name)
             name
    

    【讨论】:

    • 我忘记了一些引号。它现在有效吗?如果不是 - 会出现什么错误?
    • 它说“instr”函数不存在。事实上,它是在 2012 年 12 月才添加的(版本 3.7.15,sqlite.org/changes.html)。我需要在 Android 应用程序中使用它,所以很遗憾我不能使用 instr :-(
    • 很遗憾没有定义 instr 函数
    • @DanieleB:试试position()
    • 而且我相信 concat() 在 SQLite 中也不存在。是的,这是一种原始 DBMS...
    【解决方案2】:

    不确定是否可以减少冗长,但这应该可以。我使用? 作为变量的占位符。您发布的查询似乎不是正确的 SQL。

    SELECT * FROM table1
    WHERE name LIKE '%' || ? || '%'
    ORDER BY (CASE WHEN SUBSTR(Name,1,1) = SUBSTR(?,1,1) THEN 0 ELSE 1 END), 
             name
    

    【讨论】:

    • 事实证明,您的解决方案是最好的解决方案。我必须添加 lower() 以使其不区分大小写。 SELECT * FROM table WHERE name LIKE '%' + $keyword + '%' ORDER BY (CASE WHEN LOWER(SUBSTR(name,1,1)) = LOWER(SUBSTR($keyword,1,1)) THEN 0 ELSE 1 END), name
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多