按字母范围选择

问题描述 投票:0回答:5

Table

students
我正在尝试按 A-M 范围内的字母名称进行排序:

我已经尝试过:

SELECT *  FROM student  WHERE student_first_name like '[A-M]%';

它没有给我任何东西。

sql sqlite where-clause glob sql-like
5个回答
1
投票

您正在使用支持

GLOB
运算符的 SQLite,您可以在其中使用
[x-y]
列表通配符和
*
而不是
%

SELECT * FROM student WHERE student_first_name GLOB '[A-M]*';

请注意,

GLOB
区分大小写。

如果您想要不区分大小写的结果,请使用:

SELECT * FROM student WHERE UPPER(student_first_name) GLOB '[A-M]*';

1
投票

SQLight LIKE 仅支持

%
_
。对于您想要做的事情,您可以使用 GLOB 代替。

GLOB 运算符与 LIKE 运算符类似。与 LIKE 运算符不同,GLOB 运算符区分大小写并使用 UNIX 通配符。


1
投票

LIKE
运算符不支持字符类 - 仅支持通配符。

要获取所有以 A-M 开头的名称,您可以

  • 使用 13 个 LIKE 表达式并对它们进行 OR

    where last_name like 'A%' or last_name like 'B%' or ... or last_name like 'M%'

  • 使用 RDBMS 的正则表达式匹配风格

    where last_name ~ '^[A-M]'

  • 使用 RDBMS 的函数获取字符串的第一个字符并将其与

    IN
    列表进行比较

    where substr(last_name, 1, 1) in ('A', 'B', ..., 'M')

SQL Fiddle (PostgreSQL)


1
投票

您的版本不起作用,因为您要求它提供所有姓名以方括号开头的学生,而它正确地告诉您没有。

除了其他答案之外,您还可以使用

Where first_name between 'A' And 'N' And first_name<'N'

通过使用first_name列上可能存在的任何索引,此版本更有可能更快,因为您没有对其执行计算。


1
投票

在 SQL 中不确定,但我在 MySQL 中测试了以下查询,它对我来说工作得很好。

请使用

REGEXP
,如下所示:

SELECT * FROM student  WHERE student_first_name REGEXP '^[A-M]';
© www.soinside.com 2019 - 2024. All rights reserved.