我需要为我的软件用户添加按字符范围选择记录的功能 如何编写一个返回名称落在Ba-Bi范围内的表中所有小部件的查询?
目前我使用的是大于和小于运算符,因此上面的示例将变为:
select * from widget
where name >= 'ba' and name < 'bj'
注意我如何将上限的最后一个字符“增加”从i到j,这样就不会遗漏“自行车”。
是否有一种通用方法可以根据字段的排序规则查找给定字符后的下一个字符,还是更安全地创建第二个条件?
select * from widget
where name >= 'ba'
and (name < 'bi' or name like 'bi%')
我的应用程序需要支持本地化。这种查询对不同字符集的敏感程度如何?
我还需要支持MSSQL和Oracle。无论数据中出现何种语言,我有哪些选项可以确保忽略字符大小写?
答案 0 :(得分:3)
让我们直接跳到本地化。你会说“aa”&gt; =“ba”吗?可能不是,但这就是它在瑞典的分类。此外,您根本无法假设您可以忽略任何语言的套管。套管明确依赖于语言,最常见的例子是土耳其语:大写字母i是İ。小写我是ı。
现在,您的SQL DB通过“归类顺序”定义&lt;,== etc的结果。这绝对是语言特定的。因此,对于每个查询,您应该明确地控制它。土耳其整理令将把我们所属的地方(土耳其语)。您不能依赖默认排序规则。
至于“增量部分”,不要打扰。坚持&gt; =和&lt; =。
答案 1 :(得分:0)
对于MSSQL,请参阅此主题:http://bytes.com/forum/thread483570.html。
对于Oracle,它取决于您的Oracle版本,因为Oracle 10现在支持类似查询的正则表达式:http://www.psoug.org/reference/regexp.html(搜索regexp_like)并查看此文章:http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html
HTH
答案 2 :(得分:0)
令人沮丧的是,Oracle子串函数是SUBSTR(),而SQL-Server则是SUBSTRING()。
您可以围绕其中一个或两个编写一个简单的包装器,以便它们共享相同的函数名+原型。
然后你可以使用
MY_SUBSTRING(name, 2) >= 'ba' AND MY_SUBSTRING(name, 2) <= 'bi'
或类似。
答案 3 :(得分:0)
你可以用这个......
select * from widget
where name Like 'b[a-i]%'
这将匹配名称以b开头的任何行,第二个字符位于a到i的范围内,其他任何字符都会跟随。
答案 4 :(得分:0)
我认为我会选择一些简单的方法,例如在上限的末尾添加一个高排序字符串。类似的东西:
select * from widgetwhere name >= 'ba' and name <= 'bi'||'~'
我不确定EBCDIC转换能否继续存在
答案 5 :(得分:0)
你也可以这样做:
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'