2008-09-30 61 views
5

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

回答

3

让我们直接跳到本地化。你会说“aa”> =“ba”吗?可能不会,但这就是瑞典的地方。另外,你根本无法假定你可以忽略任何语言的套路。外壳是明确的语言依赖,最常见的例子是土耳其语:大写字母i是İ。小写字母I是我。

现在,您的SQL DB通过“整理顺序”来定义<,==等的结果。这绝对是语言特定的。所以,你应该明确地控制这个,对于每个查询。土耳其语整理顺序将把我所属的地方(土耳其语)。你不能依靠默认的排序规则。

至于“增量部分”,不要打扰。坚持> =和< =。

0

无奈的是,在Oracle子字符串函数是SUBSTR(),而SQL-Server是SUBSTRING()。

你可以在它们中的一个或两个上写一个简单的包装,以便它们共享相同的函数名称+原型。

然后,你可以使用

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

或相似。

0

您可以使用此...

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

其中名称与B开始这将匹配任何行,第二个字符是在一个范围内对我,和任何其他字符跟进。

+0

我相信,至少在MySQL中,这将是“rlike”,而不是“喜欢”。 – pilsetnieks 2008-09-30 12:24:52

0

我认为我会采取一些简单的措施,例如在上限末尾附加一个高分类字符串。喜欢的东西:

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

我不知道这会生存EBCDIC转换虽然

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' 
相关问题