如何将CASE语句与字母数字OrderBY的内部联接组合

时间:2019-07-16 10:41:24

标签: sql sql-server sql-order-by

在此查询中,我试图选择所有不同的(字母数字)计算机名称并正确地对其进行排序(1、2、5、10、15,而不是1,10、15、2、5)。当INNER JOIN未加入LocalName时,CASE语句被证明可以工作,所以我怀疑这是问题所在。

SELECT DISTINCT MCGroup, VisionMachinePerformance.MCSAP, ZAssetRegister.LocalName 
FROM [VisionMachinePerformance] INNER JOIN ZAssetRegister ON VisionMachinePerformance.MCSAP=ZAssetRegister.SAP_Number 
ORDER BY
CASE WHEN PATINDEX('%[0-9]%',LocalName) > 1 THEN 
LEFT(LocalName,PATINDEX('%[0-9]%',LocalName)-1) 
ELSE LocalName END , 
CASE WHEN PATINDEX('%[0-9]%',LocalName) > 1 THEN 
CAST(SUBSTRING(LocalName,PATINDEX('%[0-9]%',LocalName),LEN(LocalName)) as float) 
ELSE NULL END

报告的错误是“ SQL错误(145):如果指定了SELECT DISTINCT,则ORDER BY项目必须出现在选择列表中”。

我尝试将CASE语句中的所有引用更改为ZAssetRegister.LocalName和VisionMachinePerformance.LocalName,但没有成功。

删除所有CASE语句并按LocalName进行排序确实可以,但是上述顺序是错误的(1,10,15,2,5)。

有人可以建议如何做这项工作吗?

TIA!

1 个答案:

答案 0 :(得分:0)

您可以使用子查询将两个部分分开:

SELECT * FROM (
    SELECT DISTINCT MCGroup, VisionMachinePerformance.MCSAP, ZAssetRegister.LocalName 
    FROM [VisionMachinePerformance]
    INNER JOIN ZAssetRegister ON VisionMachinePerformance.MCSAP=ZAssetRegister.SAP_Number
) DISTINCT_DATA
ORDER BY
    CASE WHEN PATINDEX('%[0-9]%',LocalName) > 1
         THEN LEFT(LocalName,PATINDEX('%[0-9]%',LocalName)-1) 
         ELSE LocalName END,
    CASE WHEN PATINDEX('%[0-9]%',LocalName) > 1
         THEN CAST(SUBSTRING(LocalName,PATINDEX('%[0-9]%',LocalName),LEN(LocalName)) as float)
         ELSE NULL END