抱歉我的英文。
我想检索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
可能包含“газ”,“Ювелир”等。
答案 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 'Æ'是假的。)。“
答案 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+"%"]);