SQL Server 2008中的字符串比较

时间:2011-05-29 01:42:22

标签: sql sql-server-2008

SQL Server 2008是否有一个字符串比较方法来检查哪个字符串应该首先出现(ex'abc'出现在'abd'之前等)?我需要做一个< =比较。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

字符串排序

a1 - a10字符串按此顺序排序:

a1
a10
a2
a3
a4
...

这是因为a1和a10都以“a1”开头。

由于它们是字符串,因此数值无关紧要。看看当我们用a-z代替0-9时会发生什么:

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

如果alpha部分总是一个字符,你可以更简单地完成它。如果数字后面可以有数字,那么需要更多的麻烦。

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

<强>整理

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

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()