Функция DECODE () в SQL Server

SELECT PC_COMP_CODE,
       'R',
       PC_RESUB_REF,
       DECODE(PC_SL_LDGR_CODE, '02', 'DR', 'CR'),
       PC_DEPT_NO DEPT,
       '', --PC_DEPT_NO,
       PC_SL_LDGR_CODE + '/' + PC_SL_ACNO,
       SUM(DECODE(PC_SL_LDGR_CODE, '02', 1, -1) * PC_AMOUNT),
       PC_CHEQUE_NO CHQNO
  FROM GLAS_PDC_CHEQUES
 WHERE PC_RESUB_REF IS NOT NULL 
   AND PC_DISCD NOT IN ('d', 'D', 'T') 
GROUP BY PC_RESUB_REF, 
         PC_COMP_CODE, 
         'JJ', 
         PC_SL_LDGR_CODE + '/' + PC_SL_ACNO, 
         PC_DEPT_NO, 
         PC_CHEQUE_NO, 
         DECODE(PC_SL_LDGR_CODE, '02', 'DR', 'CR')

Выше запрос Oracle; Как я могу использовать функцию DECODE () в SQL Server 2005?

13.10.2009 09:58:31
Возможно, вы захотите немного переформатировать SQL и уточнить, в чем заключается конкретная проблема.
Tom Hubbard 13.10.2009 10:00:17
BIBD 10.01.2013 17:49:43
8 ОТВЕТОВ
РЕШЕНИЕ

Вы можете использовать синтаксис «CASE .. WHEN .. THEN .. ELSE .. END» в SQL.

52
13.10.2009 10:04:28

Если я правильно понимаю вопрос, вы хотите эквивалент декодирования, но в T-SQL

Select YourFieldAliasName =
CASE PC_SL_LDGR_CODE
    WHEN '02' THEN 'DR'
    ELSE 'CR'
END
27
13.10.2009 10:04:28

когда я использую функцию

select dbo.decode(10>1 ,'yes' ,'no')

затем произнесите синтаксическую ошибку рядом с '>'

К сожалению, это не поможет вам получить предложение CASE в SQL, поскольку оно понадобится вам для преобразования логического выражения в битовый параметр, соответствующий типу первого аргумента функции:

create function decode(@var1 as bit, @var2 as nvarchar(100), @var3 as nvarchar(100))
returns nvarchar(100)
begin
return case when @var1 = 1 then @var2 else @var3 end;
end;

select dbo.decode(case when 10 > 1 then 1 else 0 end, 'Yes', 'No');
0
7.08.2019 09:47:15

Создание функции в SQL Server , как показано ниже , и заменить DECODEсdbo.DECODE

CREATE FUNCTION DECODE(@CondField as nvarchar(100),@Criteria as nvarchar(100), 
                       @True Value as nvarchar(100), @FalseValue as nvarchar(100))
returns nvarchar(100)
begin
       return case when @CondField = @Criteria then @TrueValue 
                   else @FalseValue end
end
3
7.08.2012 09:13:16

Это легко сделать:

select 
    CASE WHEN 10 > 1 THEN 'Yes'
    ELSE 'No'
END 
2
21.05.2015 03:57:25

присоединиться к этой "буквальной таблице",

select 
    t.c.value('@c', 'varchar(30)') code,
    t.c.value('@v', 'varchar(30)') val
from (select convert(xml, '<x c="CODE001" v="Value One" /><x c="CODE002" v="Value Two" />') aXmlCol) z
cross apply aXmlCol.nodes('/x') t(c)
1
13.11.2015 02:18:18

Просто для полноты (потому что никто не опубликовал самый очевидный ответ):

Oracle:

DECODE(PC_SL_LDGR_CODE, '02', 'DR', 'CR')

MSSQL (2012+):

IIF(PC_SL_LDGR_CODE='02', 'DR', 'CR')

Плохие новости:

DECODEс более чем 4 аргументами приведет к уродливому IIFкаскаду

18
17.03.2020 00:10:23
IIF - это SQL Server 2012 и выше - просто предостережение. Первоначальный вопрос был в 2005 году, хотя большая часть воли уже продвинулась вперед.
Andrew 18.01.2019 12:20:31
Более элегантное решение с новой версией сервера sql!
asidis 11.02.2019 14:07:04
Спас мой день, потому что у меня уже было много случаев, когда со случаем, когда внутри :)
Claudio Lopes 4.12.2019 11:34:40

В моем случае я использовал его во многих местах в первом примере, если у вас есть 2 значения для оператора выбора, например, пол (мужской или женский), а затем используйте следующий оператор:

SELECT CASE Gender WHEN 'Male' THEN 1 ELSE 2 END AS Gender

Если существует более одного условия, например, национальности, вы можете использовать его как следующее утверждение:

SELECT CASE Nationality 
WHEN 'AMERICAN'   THEN 1 
WHEN 'BRITISH'   THEN 2
WHEN 'GERMAN'    THEN 3 
WHEN 'EGYPT'     THEN 4 
WHEN 'PALESTINE' THEN 5 
ELSE 6 END AS Nationality 
0
13.10.2019 18:01:00