Where-Clause中忽略的字符?

时间:2015-08-31 07:11:02

标签: sql sql-server sql-server-2008

我有以下问题:

我尝试选择'G-'以下的所有内容,但因为它似乎忽略了 - 并使用G及以下选择所有内容。

select * from tableA where ColumnA > 'G-' order by ColumnA 

如果我使用> 'G-T',则会完全忽略'-',给我'GT...'

之类的内容

3 个答案:

答案 0 :(得分:2)

'-'的排序值低于'T'的排序值,因此'G-'低于'GT'

所以

select * from tableA where ColumnA > 'G-' order by ColumnA 

将返回'GT',但

select * from tableA where ColumnA < 'G-' order by ColumnA 

不会。 '-'不会被忽略,只会低于'T'

当然,出于同样的原因,尝试使用ColumnA > 'G-T'也是如此。

如果您要选择以'G-'开头的所有内容,请使用LIKE

select * from tableA where ColumnA LIKE 'G-%' order by ColumnA 

答案 1 :(得分:1)

问题在于整理 - 您使用文本整理来排序看似非文本数据的内容。鉴于您的要求,我建议使用Latin1_General_Binary作为列的排序规则 - 假设数据真正 强烈形成,而不是“类似人”。

例如,对于

的值
G-
G 22
G-T
GT

Latin1_General_Binary的排序是

G 22
G-
G-T
GT

在Latin1_General_CI_AS中,它是

G-
G 22
GT
G-T

这个的基本原因是-被认为是一个可忽略的角色;例如,目的是在co-operation附近对cooperation进行排序。这对于文本排序非常重要 - 例如,在捷克语中,Ch被视为单个字母(在H之后,而不是C),因此即使它被写为两个单独的字母, Latin2,排序必须考虑到这一点。

GT大于G-T有些不可避免 - 符号和控制字符往往位于大多数排序规则中的数字和字母之前。这困扰你的程度取决于你的要求 - 如果表格A-B对你来说是特别的,你可以使用这样的东西:

where A like `.-%` and A > `G-`

如果这不是你的问题,我会避免强迫一个非平凡的订单 - 你的指数会感谢你。

如果模式不是那么简单,那么你基本上处于一个受到伤害的世界 - SQL数据库在很大程度上依赖于规范化数据,到此时,你的ID不再是一个逻辑列。将其分成多列可能会有效,具体取决于您的要求。

答案 2 :(得分:0)

使用&#39;喜欢&#39;操作

Create table vstab
(
col1 varchar(100)
)

insert into vstab
Select 'G-1'

insert into vstab
Select 'G-2'

insert into vstab
Select 'G1'

insert into vstab
Select 'G2'

Select * from VSTab where col1 like 'G-%' order by col1