6

我需要为我的软件用户添加按字符范围选择记录的功能。
例如,如何编写一个查询来返回名称在 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。无论数据中出现什么语言,我有哪些选择可以确保忽略字符大小写?

4

6 回答 6

3

让我们直接跳到本地化。你会说 "aa" >= "ba" 吗?可能不会,但这就是瑞典的情况。此外,您根本不能假设您可以忽略任何语言的大小写。大小写明显取决于语言,最常见的例子是土耳其语:大写 i 是 İ。小写 I 是 ı。

现在,您的 SQL DB 通过“整理顺序”定义 <、== 等的结果。这绝对是特定于语言的。因此,您应该为每个查询显式控制它。土耳其语整理顺序会将这些 i 放在它们所属的位置(土耳其语)。您不能依赖默认排序规则。

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

于 2008-09-30T13:50:20.497 回答
0

对于 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

高温高压

于 2008-09-30T11:12:58.627 回答
0

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

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

然后你可以使用

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

或类似的。

于 2008-09-30T11:59:42.527 回答
0

你可以用这个...

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

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

于 2008-09-30T12:21:45.390 回答
0

我认为我会采用一些简单的方法,例如将高排序字符串附加到上限的末尾。就像是:

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

我不确定这是否会在 EBCDIC 转换中幸存下来

于 2008-09-30T12:44:39.483 回答
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'
于 2008-09-30T14:12:29.477 回答