繁体   English   中英

LIKE 对非英文字母不区分大小写

[英]LIKE case-insensitive for not English letters

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

我试过这个:

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

但是,这不起作用,可能是因为该表仅包含非英文字母。

更新:

例子:

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

在哪里:

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

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

我尝试使用添加到列定义中的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 字符的大写/小写。LIKE 运算符对超出 ASCII 范围的 unicode 字符区分大小写。例如,表达式 'a' LIKE 'A' 是 TRUE 但 'æ' LIKE 'Æ' 是假的。)。

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

该代码不起作用,因为 UPPER 仅适用于 ASCII 字符( 链接)。 为了解决这个问题,我使用 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

Redifine Like 函数(这使用 Sqlite .NET 包装器)。 还要注意 VB like 使用星号通配符。 如果您想 % 替换字符串或重新定义 GLOB。

     public static void OverrideLikeFunction()
 {
    SQLiteSpace.SQLiteFunction.RegisterFunction(typeof(SQLiteHelper.Ulike));

}

[System.Data.SQLite.SQLiteFunction(FuncType=System.Data.SQLite.FunctionType.Scalar, Name="Like")]
;
        Public Class Ulike;
            Inherits System.Data.SQLite.SQLiteFunction;
            Public Overrides Function Invoke(args() As object) As object;
            try
            {
                    if (System.Convert.IsDBNull(args(0)) || System.Convert.IsDBNull(args(1)))
                    {
                        return false;
                    }
                    return (Microsoft.VisualBasic.CompilerServices.StringType.StrLike(System.Convert.ToString(args(1)).ToUpperInvariant(), System.Convert.ToString(args(0)).ToUpperInvariant(), Microsoft.VisualBasic.CompareMethod.Binary));
                }
                catch (Exception ex)
                {
                                   return null;
                }
            }

        }

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

例如,就我而言,我只期待 [az]、[AZ] 和 [åäöÅÄÖ]:

// 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+"%"]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM