【问题标题】:case insensitive order by in SQLite in .net.net中的SQLite中不区分大小写的顺序
【发布时间】:2010-10-29 09:40:54
【问题描述】:

我在使用 SQLite.net (http://sqlite.phxsoftware.com) 的 C# 程序中使用 SQLite。

默认情况下,SQLite 选择 order by 子句排序区分大小写,我希望结果不区分大小写,我发现“COLLATE NOCASE”但文档说它只会处理 ascii 范围内的英文字符,我想要真正的语言国际使用 CultureInfo.CurrentCulture 排序规则进行不区分大小写的排序(使用 String.Compare 就可以了)。

【问题讨论】:

    标签: .net sqlite sql-order-by case-insensitive


    【解决方案1】:

    您可以简单地使用lower() sqlite 函数:

    select * from data order by lower(name)
    

    【讨论】:

    • 正确的方法是 select * from data order by lower(name), name
    • SQLite lower()ORDER BY 有同样的问题 - 仅适用于 ASCII。你得自己写函数,看下一个答案stackoverflow.com/a/918234/254109
    【解决方案2】:

    您可以使用 ToLower() 方法快速获得结果:

    return model.Users.OrderBy(u => u.Name.ToLower()).ToList();
    

    【讨论】:

    • 太慢了)转换整个字符串只是为了使用前几个字符
    • 你试过了吗?它的转换发生在 SQL 端。
    • 是的。我不认为双方对 msil 的解释不同。
    【解决方案3】:

    我相信当前版本的 SQLite 中没有提供这种排序规则。因此,似乎最明智的计划是从查询中删除排序,然后在纯 .Net 中排序,您可以完全控制和访问线程的文化信息等结构。

    由于两者都发生在同一个过程中,除非您的数据集非常大,否则这不会在性能方面产生很大差异。

    SQLite 3 确实允许用户定义排序规则函数,这些可以在 SQLite.Net 中作为 .net 函数完成,但是跨托管/非托管边界来回调用的开销是相当大的。这是一个persons attempts to do it in c++。除非您可以访问其他人在 C++ 中经过良好测试且稳定的 unicode 文化敏感排序,否则我建议尽可能坚持简单排序。

    当然,如果用户定义的排序规则的性能足以满足您当前的需求,那就去吧。

    [SQLiteFunction(Name = "CULTURESORT", FuncType = FunctionType.Collation)]
    class CultureSort : SQLiteFunction
    {
        public override int Compare(string param1, string param2)
        {
            return String.Compare(
                param1,param2, CultureInfo.CurrentCulture, CompareOptions.IgnoreCase)
            );
        }
    }
    

    如果您想花哨,请发布脚本: 有一个幸运的 SQLite 构建,integrates the ICU library 用于在 ordering/like/upper/lower 上提供“适当的”unicode 支持,但您需要将其集成到用作 .Net 包装器支持的 sqlite 代码中。这很多都不容易。

    【讨论】:

      【解决方案4】:

      SQLite.NET 允许您在 C# 中定义可在 SQL 查询中使用的自定义函数。所以应该可以在 C# 中编写一个 custom_upper 或 custom_lower 函数来处理当前区域性排序规则的大小写转换...

      【讨论】:

        【解决方案5】:

        是的,这比您想象的要复杂得多。在某些文化中,规则是不同的,如果不知道你想要建立什么样的文化,那就不可能了。考虑著名的(在 i18n 人中)Turkish 的例子。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-16
          • 2017-03-17
          • 2013-03-06
          • 2012-05-04
          • 2011-03-25
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多