SQL查询以替换字符串并将字符串的其余部分转换为Int

时间:2018-11-02 14:30:27

标签: sql sql-server

我有以下查询。该查询应该使用我的where参数查看我的帐户表。这将返回所有以前3个字母“ DAG”开头的帐户代码。数据返回的格式始终一致,以三个字母开头,后跟一个数字。然后,我想获得最大的数字。为此,我通过将字符串转换为Int来对其进行排序。

我收到以下错误消息:

  

Msg 207,第16层,状态1,第24行
  无效的列名'AccountCodeWithoutDAG'。

这是我的SQL查询。

SELECT TOP 1 
    REPLACE(AccountCode, 'DAG', '') AS AccountCodeWithoutDAG 
FROM 
    Accounts 
WHERE
    MangCode = 'ADFG'  
ORDER BY
    CONVERT(INT, AccountCodeWithoutDAG)

我在做什么错了?

3 个答案:

答案 0 :(得分:3)

您不能将order byconvert别名一起使用

但是您可以尝试使用子查询来获取AccountCodeWithoutDAG,然后order by

SELECT  TOP 1 AccountCodeWithoutDAG 
FROM 
(
    SELECT REPLACE(AccountCode,'DAG','') AS AccountCodeWithoutDAG
    FROM Accounts 
    where  MangCode = 'ADFG'  
) t1
Order by  Convert(int, AccountCodeWithoutDAG )

答案 1 :(得分:2)

正如其他人所指出的那样,在select中为计算值提供别名并不能使您在后续子句中使用相同的别名。

在sql服务器中完成此操作的方法是cross apply

SELECT TOP 1 AccountCodeWithoutDAG
FROM Accounts 
cross apply (select REPLACE(AccountCode,'DAG','') AS AccountCodeWithoutDAG ) as calcquery
where 
   MangCode = 'ADFG'  
   Order by Convert(int, AccountCodeWithoutDAG )

答案 2 :(得分:1)

问题是AccountCodeWithoutDAG,这是一个别名,不能按顺序使用 看看我在下面的测试中所做的工作,在

的转换部分中使用您的replace语句
declare @AccountCode varchar(100)='DAG123456'

SELECT  top 1 REPLACE(@AccountCode,'DAG','') AS AccountCodeWithoutDAG 
   Order by Convert(int, REPLACE(@AccountCode,'DAG',''))