根据字符范围选择字符串字段的最佳方法是什么?
我需要为软件用户添加按字符范围选择记录的功能。
例如,如何编写查询以返回名称在Ba-Bi范围内的表中的所有窗口小部件?
当前,我使用的是大于和小于运算符,因此上面的示例将变为:
select * from widget where name >= 'ba' and name < 'bj'
请注意,我是如何将i的上限的最后一个字符"递增"到i,以便不会遗漏" bike"。
是否有一种通用方法可以根据字段的排序规则在给定字符之后找到下一个字符,还是创建第二个条件更安全?
select * from widget where name >= 'ba' and (name < 'bi' or name like 'bi%')
我的应用程序需要支持本地化。这种查询对不同字符集的敏感性如何?
我还需要同时支持MSSQL和Oracle。无论数据中出现哪种语言,我有什么选择可以确保忽略字符大小写?
解决方案
对于MSSQL,请参见以下线程:http://bytes.com/forum/thread483570.html。
对于Oracle,它取决于Oracle版本,因为Oracle 10现在支持诸如查询之类的regex(p):http://www.psoug.org/reference/regexp.html(搜索regexp_like),请参阅本文:http:/ /www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html
高温超导
令人沮丧的是,Oracle子字符串函数是SUBSTR(),而它在SQL Server中是SUBSTRING()。
我们可以为它们中的一个或者两个编写一个简单的包装程序,以便它们共享相同的函数名+原型。
那你就可以用
MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'
或者类似。
你可以用这个...
select * from widget where name Like 'b[a-i]%'
这将匹配名称以b开头,第二个字符在a到i范围内的任何行,然后是其他任何字符。
我认为我可以进行一些简单的操作,例如将高排序字符串添加到上限的末尾。就像是:
select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'
我不确定这是否会在EBCDIC转换后继续存在
让我们直接跳到本地化。我们会说" aa"> =" ba"吗?可能不是,但这就是瑞典的分类方式。此外,我们根本无法假设我们可以忽略任何语言的大小写。外壳与语言明确相关,最常见的示例是土耳其语:大写i是?。小写字母I是?。
现在,SQL DB通过"排序规则"定义了<,==等的结果。这绝对是特定于语言的。因此,我们应该为每个查询显式地控制它。土耳其排序规则将把那些i放在它们所属的位置(以土耳其语显示)。我们不能依赖默认排序规则。
至于"增量部分",请不要打扰。坚持> =和<=。
我们也可以这样做:
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'