代码之家  ›  专栏  ›  技术社区  ›  Nathan Baulch

根据字符范围选择字符串字段的最佳方法是什么?

  •  5
  • Nathan Baulch  · 技术社区  · 16 年前

    我需要添加软件用户按字符范围选择记录的功能。
    例如,如何编写一个返回表中名在ba bi范围内的所有小部件的查询?

    目前我使用的是大于和小于运算符,因此上面的示例将变为:

    select * from widget
    where name >= 'ba' and name < 'bj'
    

    注意我是如何将上界的最后一个字符从i“递增”到j的,这样“bike”就不会被省略。

    是否有一种基于字段排序规则的通用方法来查找给定字符之后的下一个字符,或者创建第二个条件更安全?

    select * from widget
    where name >= 'ba'
    and (name < 'bi' or name like 'bi%')
    

    我的应用程序需要支持本地化。这种查询对不同的字符集有多敏感?

    我还需要同时支持MSSQL和Oracle。无论数据中出现什么语言,我都可以选择哪些选项来确保忽略字符大小写?

    6 回复  |  直到 16 年前
        1
  •  3
  •   MSalters    16 年前

    让我们直接跳到本地化。您会说“aa”>=“ba”吗?或许不是,但瑞典就是这样。此外,您不能简单地假设您可以忽略任何语言中的大小写。大小写明显依赖于语言,最常见的例子是土耳其语:大写的I是_“。小写I是_±。

    现在,您的SQL数据库通过“排序顺序”定义<、==等的结果。这绝对是语言特有的。所以,对于每个查询,您都应该显式地控制它。土耳其语的排序将把那些我是他们所属的地方(土耳其语)。不能依赖默认排序规则。

    至于“增量部分”,不用麻烦了。坚持>=和<=。

        2
  •  0
  •   Zsolt Botykai    16 年前

    有关MSSQL,请参阅此线程: http://bytes.com/forum/thread483570.html .

    对于Oracle,它取决于您的Oracle版本,因为Oracle10现在支持类似regex(p)的查询: http://www.psoug.org/reference/regexp.html (搜索regexp ou like)并参见本文: http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html

    高温高压

        3
  •  0
  •   cagcowboy    16 年前

    令人沮丧的是,Oracle子字符串函数是substr(),而它是SQL Server子字符串()。

    您可以围绕它们中的一个或两个编写一个简单的包装器,以便它们共享相同的函数名+原型。

    那你就可以用

    MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'
    

    或类似的。

        4
  •  0
  •   George Mastros    16 年前

    你可以用这个…

    select * from widget
    where name Like 'b[a-i]%'
    

    这将匹配名称以B开头的任何行,第二个字符在A到I的范围内,然后是任何其他字符。

        5
  •  0
  •   David Aldridge    16 年前

    我想我会做一些简单的事情,比如在上界的末尾附加一个高排序字符串。类似:

    select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'
    

    不过,我不确定这是否能通过EBCDIC转换

        6
  •  0
  •   Carlton Jenke    16 年前

    你也可以这样做:

    select * from widget
    where left(name, 2) between 'ba' and 'bi'
    

    如果您的条件长度发生了变化(正如您在留下的注释中所指出的那样),那么查询还需要将长度作为输入:

    declare @CriteriaLength int
    set @CriteriaLength = 4
    select * from widget
    where left(name, @CriteriaLength) between 'baaa' and 'bike'