2017-02-02 2 views
0

У меня есть эта линия, я борюсь с преобразовать запрос из Oracle в SQL Server 2012 следующая строка:Преобразовать Decode из Oracle в случае из MS SQL Server

DECODE(SUM(DECODE(a.canceldate, NULL, 1,0)), 1, NULL, To_Date(MAX(TO_CHAR(a.canceldate,'yyyymmdd')), 'yyyymmdd')) dCancelDate, 

Как я inteprete для преобразования это нравится:

case a.canceldate 
    (when sum(case a.canceldate when Null then 1 else 0 end)) 
    when 1 
     then 0 
     else convert(datetime,a.canceldate) 
end max(a.canceldate) as dCancelDate, 

Я признателен помощнику, моя линия не подходит для SQL Server 2012.

ответ

1

decode формула эквивалентна

case sum(case when a.canceldate is null then 1 else 0 end) when 1 then null 
    else to_date(...) end dCancelDate, ... 

Одна ошибка, которую я видел в вашем переводе, состоит в том, что у вас есть when sum(...) when 1. Вы не можете иметь это в обоих направлениях, это либо when sum(...) = 1, либо sum(...) when 1. Это может быть единственная ошибка, я не выглядел слишком тяжело.

Что имеется в пределах to_date() ужасно; вы преобразовываете даты в строки символов, затем принимаете МАКСИМАЛЬНЫЙ АЛФАВИТНЫЙ ЗАКАЗ, а затем переводите назад? Зачем? Возможно, вы просто удаляете компонент времени в день? Это намного проще сделать с trunc(max(a.canceldate)).

+0

@JoelJacobson - два возможных синтаксиса для 'case', один с логическим условием (например,' = ', но это могут быть и другие вещи, такие как' is null '), а другое только со значениями, называются «** simple **' case' expression »и« ** look ** выражение case », по крайней мере, в Oracle. Не уверен, поддерживает ли SQL Server оба; Я использовал оба перевода. Если он не работает как есть, попробуйте использовать только «простой» синтаксис. – mathguy

+0

Итак, я дал ему выстрел, но 'trunc (max (a.canceldate))' не распознает функцию, я стараюсь не уверен, что код отправителя из oracle, но мне просто нужно его преобразовать, поскольку это спасибо , –

+1

@JoelJacobson - Работает ли выражение перевода «case»? Если вы не можете проверить из-за 'max (...)' (вычисления даты), замените эту часть простой датой (например, SYSDATE в Oracle, не уверен, что такое SQL Server), чтобы увидеть, декодирование "является правильным. Если вам нужна дополнительная помощь при вычислении даты, возможно, это отдельный вопрос, который вы можете разместить здесь (не связанный с переводом DECODE на CASE). – mathguy

Смежные вопросы