如何解决如何在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,\'\'))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。