SQL-запрос для замены строки и преобразования оставшейся части строки в Int

У меня есть запрос ниже. Предполагается, что этот запрос просматривает таблицу моих учетных записей с моим параметром where. Это вернет все коды учетных записей, которые начинаются с ведущих трех букв «DAG». Возврат данных всегда осуществляется в формате, начинающемся с трех букв, за которыми следует число. Затем я хочу получить наибольшее число. Для этого я заказываю строку, преобразовывая ее в Int.

Я получаю эту ошибку ниже:

Msg 207, Level 16, State 1, Line 24
Invalid column name 'AccountCodeWithoutDAG '.

Вот мой SQL-запрос.

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

Что я делаю неправильно?

ВЫБРАТЬ ... ОТ ... ГДЕ ... ЗАКАЗАТЬ ...

jarlh 02.11.2018 15:31

ГДЕ идет после ОТ

ArcherBird 02.11.2018 15:32

извините, это была моя плохая копия. Я отредактировал это

HereToLearn_ 02.11.2018 15:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
77
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема в AccountCodeWithoutDAG, это псевдоним, и его нельзя использовать в указанном порядке. Посмотрите, что я сделал при тестировании ниже, используйте оператор replace в части преобразования порядка с помощью

declare @AccountCode varchar(100)='DAG123456'

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

ORDER запускается после оператора SELECT, поэтому псевдоним отображается

Ajan Balakumaran 02.11.2018 15:39

@AjanBalakumaran Полностью зависит от того, какую версию sql-сервера он использует. То, что вы описываете, является довольно новой функцией

Joe Phillips 02.11.2018 15:41
Ответ принят как подходящий

Вы не можете использовать order by с псевдонимом convert

но вы можете попробовать использовать подзапрос, чтобы получить 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 )

Мне любопытно, как это работает против простого повторения convert в select и orderby. Чувствует себя намного чище, если делать это по-другому

Joe Phillips 02.11.2018 15:46

Как указывали другие, присвоение вычисленного значения псевдониму в 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 )

Вы должны любить крест применять! Много замечательных применений!

George Menoutis 02.11.2018 16:02

Другие вопросы по теме