Sqlite - LIKE不区分大小写,不是英文字母

时间:2014-03-12 06:41:03

标签: sql sqlite sql-like

抱歉我的英文。

我想检索TITLE字段符合某种模式(不区分大小写)的行,并且此字段仅包含非英语字母。

我试过了:

SEARCH * FROM TABLE_NAME WHERE UPPER(column_name) LIKE UPPER('%pattern%');

但是,它不起作用,可能是因为该表只包含 not-English 字母。

更新

示例:

SELECT * FROM PartnersTable WHERE UPPER(TitleColumn) LIKE UPPER('%pattern%') ;

其中:

TitleColumn可能包含“Газпром”,“Лукойл”,“Йотафон”,“Мечтаювелира”

pattern可能包含“газ”,“Ювелир”等。

3 个答案:

答案 0 :(得分:3)

我尝试使用COLLATE NOCASE添加到列定义中。如果你能够做到这一点,那就可以了。

我测试了什么:

CREATE TABLE PartnersTable 
    (`id` , `TitleColumn` COLLATE NOCASE )
;

添加了与您的问题相同的日期:

INSERT INTO PartnersTable
    (`id`, `TitleColumn`)
VALUES
 (1, 'Газпром'), (2, 'Лукойл'), (3, 'Йотафон'), (4, 'Мечта ювелира')
;

然后尝试选择它:

select *
from PartnersTable
where TitleColumn like '%Ювелир%'

有效。

在这里演示: http://sqlfiddle.com/#!7/ae8f8/2

编辑: 您也可以在没有UPPER的情况下使用它。默认情况下,LIKE不区分大小写。 根据文件:

  

任何其他字符与其自身匹配或者它的大小写相等(即不区分大小写的匹配)。 (一个错误:SQLite只能理解ASCII字符的大写/小写.LELKE运算符对超出ASCII范围的unicode字符区分大小写。例如,表达式'a'LIKE'A'为TRUE但是'æ'LIKE 'Æ'是假的。)。“

在这里演示: http://sqlfiddle.com/#!7/c9b5d/1

答案 1 :(得分:2)

代码不起作用,因为 UPPER 仅适用于 ASCII 字符 (link)。为了解决这个问题,我使用 BindFunction for .NET 实现了用户定义函数,如下所示。

// for System.Data.SQLite
connection.BindFunction(
    new SQLiteFunctionAttribute("myupper", 1, FunctionType.Scalar),
    (Func<object[], object>)((object[] args) => ((string)((object[])args[1])[0]).ToUpper()),
    null);
        
// for Microsoft.Data.Sqlite
connection.CreateFunction(
    "myupper",
    (string arg) => (arg).ToUpper());

var command = connection.CreateCommand();
command.CommandText =
@"
    SELECT *
    FROM PartnersTable 
    WHERE MYUPPER(TitleColumn) LIKE MYUPPER('%pattern%')
";
      
command.ExecuteQuery()

但是执行查询需要更长的时间。

以下链接也可能有帮助

https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/user-defined-functions https://docs.microsoft.com/en-us/dotnet/standard/data/sqlite/compare

答案 2 :(得分:0)

如果您的数据仅包含一组有限的国际字母,一个快速而简单的解决方案是使用 Check docs here 手动更改国际字母的大小写。

例如,就我而言,我只期待 [a-z]、[A-Z] 和 [åäöÅÄÖ]:

// First, use application code to make the search string lowercase.
searchStr = searchStr.toLower(); 

// The SQLite function lower() will not affect ÅÄÖ, so we need 
// to manually replace them with their lowercase versions.
sql = "SELECT * "+
  " FROM table1 "+
  " WHERE "+
  "   replace(replace(replace( lower(name) , 'Å','å'), 'Ä','ä'), 'Ö','ö') LIKE ?";

db.prepare(sql, ["%"+searchStr+"%"]);