【发布时间】:2018-07-22 18:55:51
【问题描述】:
我正在尝试编写一个查询,该查询将返回按字母数字列 Code 排序的数据。
以下是我的查询:
SELECT *
FROM <<TableName>>
CROSS APPLY (SELECT PATINDEX('[A-Z, a-z][0-9]%', [Code]),
CHARINDEX('', [Code]) ) ca(PatPos, SpacePos)
CROSS APPLY (SELECT CONVERT(INTEGER, CASE WHEN ca.PatPos = 1 THEN
SUBSTRING([Code], 2,ISNULL(NULLIF(ca.SpacePos,0)-2, 8000)) ELSE NULL END),
CASE WHEN ca.PatPos = 1 THEN LEFT([Code],
ISNULL(NULLIF(ca.SpacePos,0)-0,1)) ELSE [Code] END) ca2(OrderBy2, OrderBy1)
WHERE [TypeID] = '1'
输出:
FFS1
FFS2
...
FFS12
FFS1.1
FFS1.2
...
FFS1.1E
FFS1.1R
...
FFS12.1
FFS12.2
FFS.12.1E
FFS12.1R
FFS12.2E
FFS12.2R
期望的输出:
FFS1
FFS1.1
FFS1.1E
FFS1.1R
....
FFS12
FFS12.1
FFS12.1E
FFS12.1R
我遗漏了什么或忽略了什么?
编辑:
让我尝试更好地详细说明表格内容。有 FFS1 - FFS12 的记录。这些分为 X 个子项,即 FFS1.1 - FFS1.X 到 FFS12.1 - FFS12.X。 E 和 R 不是拼写错误,每个子记录都有两个关联代码:FFS1.1E 和 FFS1.1R。
另外,我尝试使用 ORDER BY,但它排序为
FFS1 ... FFS10 FFS2
【问题讨论】:
-
如果要对查询输出进行排序,则必须使用
order by... -
您的预期输出对所有场景都没有帮助?
'FFS2'应该在哪里?'FFS.12.1E'(与您的其他示例值采用不同的格式)呢? -
您能否将表格的 ddl 附加到插入脚本和预期输出中。
-
您在这里苦苦挣扎的原因是您的表格设计未标准化。您将两条信息放在一个元组中。这违反了 1NF。修正你的设计,查询很简单。
-
@SeanLange 基于此评论,我正在使用表中的排序列来处理此问题。查询现在很简单,谢谢!
标签: sql sql-server sorting select-query