2011-05-29 174 views

回答

4

<=工作正常。你遇到的问题是你期望数字从字符串中排序。没有特殊处理,这是行不通的。

字符串排序

A1 - A10串排序顺序:

a1 
a10 
a2 
a3 
a4 
... 

这是因为A1和A10开始与 “A1”。

由于它们是字符串,所以数字值是不相关的。看看会发生什么,当我们代替0-9 A-Z:

ab 
aba 
ac 
ad 
ae 

你能看到现在为什么你得到你的结果?在字典中,aba在ac之前,a10在a2之前。

要解决您的问题,最好将您的列分成两列:一个字符和一个数字。一些不愉快的表达式可以为你找到正确的排序顺序,但这是一个更糟糕的解决方案,除非你绝对没有选择。

这是一种方法。它可能不适合或可能有更有效的方式,但我不知道你的数据是什么样的。

SELECT 
FROM Table 
WHERE 
    Col LIKE 'a%' 
    AND Substring(Col, Convert(int, PatIndex('%[^a-z]%', Col + '0'), 1000)) <= 10 

如果阿尔法部分总是一个字符,你可以更简单地做到这一点。如果数字后面有字母,则需要更多的旋转。

您也可以尝试一个派生表,将列拆分为单独的字母和数字部分,然后将条件放入外部查询中。

整理

注意每个字符串和基于字符列有确定哪些字母排序一起(主要是大小写和重音),这可以改变不平等的操作结果的排序规则设置。

SELECT * 
FROM Table 
WHERE Value <= 'abc' 

SELECT CASE WHEN Value <= 'abc' COLLATE Latin1_General_CS_AS_KS_WS THEN 1 ELSE 0 END 
FROM Table 

我在那里使用的排序规则区分大小写,区分重音。

你可以看到所有的排序规则提供给你,像这样:

SELECT * 
FROM ::fn_helpcollations() 
+0

@mwok:根据您的意见进行更新。 – ErikE 2011-05-29 02:12:11

+0

是否有某种“散列”函数会从字符串中生成一个唯一的数字,以便我可以比较而不是字符串? – mwok 2011-05-29 02:33:46

+0

@mwok不会工作。我更新了我的帖子。 – ErikE 2011-05-29 08:05:23

5

在什么情况下? <=在SELECT语句中工作。

+0

同意。各种字符串归类的列表在http://msdn.microsoft.com/en-us/library/ms144250.aspx给出 – dsolimano 2011-05-29 01:58:04

+0

SELECT * FROM ( SELECT'a1'as col1 UNION SELECT'a2'UNION SELECT'a3 'UNION SELECT'a10'UNION SELECT'test' )a WHERE col1 <='a10';只产生'a1'和'a10'。 – mwok 2011-05-29 01:59:31

+0

@mwok - 这是因为'a2'和'a3',按字母顺序排在'a10'之后。如果您希望系统评估数值,则字符串的结构必须一致。他们总是以单个角色开始? – Thomas 2011-05-29 02:12:38