【问题标题】:Sqlite - SELECT * FROM tbl WHERE name LIKE 'a%' ; NOT WORKING?Sqlite - SELECT * FROM tbl WHERE name LIKE 'a%' ;不工作?
【发布时间】:2018-11-28 16:53:54
【问题描述】:

我有这张表叫tbl:

name    |  family

ali     |  rezaei
amir    |  hoseini
milad   |  karimi
alireza |  amiri
hossein |  mahmoodi

我写了这个查询:

SELECT * FROM tbl WHERE name LIKE '%a%';

它成功了,它返回了:

阿里,阿米尔,米拉德,阿里雷萨

但是当我写这个查询时:

SELECT * FROM tbl WHERE name LIKE 'a%';

它没有返回任何东西!

LIKE 'something%' 不适合我,但 LIKE '%something'LIKE '%something%' 工作。

【问题讨论】:

  • 看起来 SQLite 认为字母不是文本中的第一个字符。您是否 100% 确定开头没有空格?

标签: sqlite select sql-like


【解决方案1】:

... WHERE name LIKE '%a%' 会在名称列的任意位置找到 a(或 A)。

... WHERE name LIKE 'a%' 将仅限于查找 a(或 A)作为名称列的第一个字符,因此看起来一个字符(可能是空白字符)在第一个字符之前.

理想/正确的解决方案是查看行是如何插入的,看看是否只有值本身被插入。

一种解决方案可能是使用WHERE LTRIM(name) LIKE 'a%';,它会在进行比较之前从一开始就删除空格。

以下是使用 2 组数据的示例,以进行演示。

  • 第一组数据与您期望的数据存储方式相同。
  • 第二组是前面带有空白(空格)字符的数据。

:-

DROP TABLE IF EXISTS tbl;
CREATE TABLE IF NOT EXISTS tbl (name TEXT, family TEXT);
INSERT INTO tbl VALUES
    ('ali','rezaei'),
    ('amir','hoseini'),
    ('milad','karimi'),
    ('alireza','amiri'),
    ('hossein','mahmoodi'),
    (' ali','rezaei'),
    (' amir','hoseini'),
    (' milad','karimi'),
    (' alireza','amiri'),
    (' hossein','mahmoodi')
;

随后运行的 3 个查询:-

SELECT * FROM tbl WHERE name LIKE '%a%';
SELECT * FROM tbl WHERE name LIKE 'a%';
SELECT * FROM tbl WHERE LTRIM(name) LIKE 'a%';

使用'%a%' 的第一个查询将返回名称列中任意位置带有a 的所有行(5 行中有 4 行在每组的名称列中包含一个2套共8个);根据:-

第二个查询是最有选择性的,只会从第一组数据中返回 3 行,因为 a 是第一个字符,而不会返回第二组中的相似行,因为a 前面有一个空格(这种可疑情况);根据:-

第三个查询是对第二个查询的改编,它修剪前导空白(空格),从每个集合中返回 3 行;根据:-

【讨论】:

    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多