在SQL(使用Access)中,我在列中有以下值:
批准,第2点,......,第10点,第11点,......,第21点
现在,如果我使用column asc
的顺序,则Point 11位于Point 2之前。我想要Point 2,Point 3来到Point 11之前。怎么做?
答案 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)
关于表现,通常的技巧是两个:
使用varcharcol, intcol
排序(包含“Point”的varcharcol和包含该数字的intcol)
添加一个额外的索引列,其中包含“Point 000001”,“Point 000010”,“Point 000020”等,并提供足够的零以满足您的需要。
答案 4 :(得分:0)
为了简洁..
SELECT * From MyTable
Order By Int(Replace(MyColumn,'Point',''))