【问题标题】:SQLite matching column name , ignoring commasSQLite 匹配列名,忽略逗号
【发布时间】:2015-12-13 16:31:58
【问题描述】:

我有一个包含几列和一列 name 的数据库,我正在通过 OrmLite 执行以下 sqlite 语句:

SELECT `name`,`id`,`ita_name`,`setCode`
FROM `MyTable`
WHERE (`name` LIKE ?)
ORDER BY `name` LIMIT 30

一切正常,但如果name 列的值为“Michael*,* Basketball player”并且我提交“Michael Basketball player”,则查询不会返回任何结果。 我已经尝试使用 %myQueryText% 但没有成功。 我该怎么做才能从我的列中返回值而忽略“,”?

【问题讨论】:

    标签: android mysql database sqlite ormlite


    【解决方案1】:

    SQL LIKE 语句比您想象的更具体。 % 通配符匹配零个或多个字符在通配符的位置,所以%myQueryText% 匹配 anythingmyQueryTextmyQueryTextanything 但不匹配 myQuery(逗号)文本。您需要在逗号位置放置通配符,请参阅SQL LIKE wildcards

    所以你可能想要类似的东西

    ... WHERE (`name` LIKE "Michael%Basketball player") ...
    

    在 Java 中编辑/准备您的搜索模式,可能类似于

    String searchPattern = "Michael Basket player";
    String preparedPattern = searchPattern.replace(' ', '%');
    // outputs pattern "Michael%Basket%player"
    

    这甚至可以匹配 迈克尔是最好的篮球运动员和其他体育运动员,如果您想克服这些麻烦,可以使用 REGEXP 并准备搜索模式:

    String searchPattern = "Michael Basket player";
    String preparedPattern = searchPattern.replace(' ', '[,\s]+');
    // outputs pattern "Michael[,\s]+Basket[,\s]+player"
    

    然后在 SQL 查询中将 WHERE 语句更改为

    WHERE `name` REGEXP "Michael[,\s]+Basket[,\s]+player"
    

    [,\s]+ 匹配逗号或空格,并且出现次数为一次或多次,因此它匹配一个空格或空格和逗号或逗号和多个空格...

    【讨论】:

    • 感谢您的回复,我知道这种行为,但我的列值有不同的名称:例如:Jane,一些文本 Alexander,其他文本所以我认为通配符方法可能有问题。列值的唯一共同点是 "," 之后总是有一个空格。情况是:[可变长度文本],[可变长度文本]也许我没有在我的问题中解释清楚:)
    • SQL LIKE 语句的逗号是没有问题的。如果您确定搜索模式是好的,那么问题出在其他地方。
    • 事实上查询工作正常,但我想搜索“Michael Basket player”并从具有“Michael,Basket player”的列中返回值。如果我在查询中写逗号,我可以检索到我想要的结果,但如果不是,我不是,因为 sql 将逗号视为要匹配的字符。
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2020-02-21
    • 2017-08-08
    • 2020-07-01
    相关资源
    最近更新 更多