如何在SQL中排序varchar?

问题描述

| 在SQL中(使用Access),我在列中具有以下值: 已批准,第2点,...,第10点,第11点,...,第21点 现在,如果我使用by0ѭ的顺序,则点11在点2之前。我希望点2,点3在点11之前。如何做?     

解决方法

如果您知道它们总是会以“名称号码”的形式出现,那么您可以做的是添加两列作为原始列的拆分,然后对它们进行排序,而不是原始列 例如。,
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\")) AS foo_number
FROM foo2
ORDER BY Left(foo,\"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部分一起使用。     ,我对此进行了测试,似乎Access足够“智能”,可以知道您想要什么。这是您需要执行的最低操作。
SELECT YourFields
FROM YourTable
ORDER BY 
   PointColumn,Mid([PointColumn],6)
这种方法和其他类似方法都无法保存,因此,如果要过滤记录
< Point 10
,它将很慢。 因此,我建议您将数据标准化。添加一个名为IsApproved(布尔值)的字段,并添加另一个称为point的字段,该字段可跟踪这些点 然后它很容易做到
SELECT IIF(IsApproved,\"Approved\",\"Point \" & [Point]) as output
FROM 
    table
WHERE
    IsApproved = true or Point < 10
ORDER BY
  IsApproved,Point
    ,不确定访问权限,但是如果有替换功能,则可以执行以下操作(例如在sql server中):
select      *,cast ( replace( replace( pointColumnName,\'Point\',\'\'),\'Approved\',1000) as int )  as points
from        tblName
order       by points
其中,tblName是表,pointColumnName是包含数据的列。     ,关于性能,通常的技巧有两个: 使用
varcharcol,intcol
排序(包含\“ Point \”的varcharcol和包含数字的intcol) 添加一个额外的索引列,其中包含\“ Point 000001 \”,\“ Point 000010 \”,\“ Point 000020 \”等,并带有足够的零以容纳您所需的内容。     ,为简洁起见
SELECT * From MyTable
Order By Int(Replace(MyColumn,\'\'))
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...