我有以下问题:
我尝试选择'G-'
以下的所有内容,但因为它似乎忽略了 - 并使用G及以下选择所有内容。
select * from tableA where ColumnA > 'G-' order by ColumnA
如果我使用> 'G-T'
,则会完全忽略'-'
,给我'GT...'
答案 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