如何在SQL中对varchar进行排序?

时间:2011-05-25 13:51:58

标签: sql ms-access sql-order-by

在SQL(使用Access)中,我在列中有以下值:

批准,第2点,......,第10点,第11点,......,第21点

现在,如果我使用column asc的顺序,则Point 11位于Point 2之前。我想要Point 2,Point 3来到Point 11之前。怎么做?

5 个答案:

答案 0 :(得分:3)

如果你知道它们总是会以“名称编号”的形式存在,那么你可以做的是添加两个与原始列分开的列,并对它们进行排序而不是原来的

如,

SELECT foo2.foo, 
    Left(foo,InStr(foo," ")) AS foo_name, 
    CLng(IIf(InStr(foo," ")>0, Right(nz(foo,0),
            Len(nz(foo,0))-InStr(nz(foo,0)," ")),"0")) AS foo_number
FROM foo2
ORDER BY Left(foo,InStr(foo," ")), 
    CLng(IIf(InStr(foo," ")>0, Right(nz(foo,0),
            Len(nz(foo,0))-InStr(nz(foo,0)," ")),"0"));

(编码和测试)

这会给你带来如下结果:

foo       foo_name  foo_number
---       --------  ----------
Approved  Approved  
Point 2   Point     2
Point 10  Point     10
Point 11  Point     11
Point 21  Point     21

并且排序将与foo_number部分一起使用。

答案 1 :(得分:2)

我对此进行了测试,似乎Access非常“智能”,足以了解您的需求。这是您需要做的最低限度。

SELECT YourFields
FROM YourTable
ORDER BY 
   PointColumn,
   Mid([PointColumn],6)

这种方法和其他类似方法不是SARGable所以如果你想过滤记录< Point 10,那么它会很慢。

所以我建议你规范化你的数据。添加一个名为IsApproved(boolean)的字段,并添加另一个名为point的字段,用于跟踪点

然后很容易做到像

这样的事情
SELECT IIF(IsApproved, "Approved", "Point " & [Point]) as output
FROM 
    table
WHERE
    IsApproved = true or Point < 10
ORDER BY
  IsApproved,
  Point

答案 2 :(得分:0)

不确定访问权限,但是如果有替换功能,那么你可以做这样的事情(比如在sql server中):

select      *, cast ( replace( replace( pointColumnName, 'Point', ''), 'Approved', 1000) as int )  as points
from        tblName
order       by points

其中tblName是表,pointColumnName是包含数据的列。

答案 3 :(得分:0)

关于表现,通常的技巧是两个:

  1. 使用varcharcol, intcol排序(包含“Point”的varcharcol和包含该数字的intcol)

  2. 添加一个额外的索引列,其中包含“Point 000001”,“Point 000010”,“Point 000020”等,并提供足够的零以满足您的需要。

答案 4 :(得分:0)

为了简洁..

SELECT * From MyTable
Order By Int(Replace(MyColumn,'Point',''))