将 Oracle decode 语句转换为 SQL Server T-SQL 语句

Convert Oracle decode statement into SQL Server T-SQL statement

当不再使用 Oracle 数据库时,我们的重点是将所有查询语句从 Oracle 转换为 SQL 服务器 (T-SQL) 语句。当解码出现问题时,我遇到了一些问题,下一行我一直在尝试更改它但是当我 运行 它在 sql 服务器中进行测试时它给了我一些错误。

Dim query As String = "SELECT DocType, 
docyear, 
docmonth, 
DECODE(docmonth, NULL, NULL, '0', '- All Months -', TO_CHAR(TO_DATE(docmonth||'/01/2008', 'MM/DD/YYYY'), 'docmonth')) 
monthAlpha, 
DID 
from dbo.Document where XALASKAID = '" & LicenseNumber & "' and DOCTYPE like '%Report%'"

但是这个解码行导致了错误。

1.

使用 Oracle 的专有函数(DECODETO_CHARTO_DATE) 甚至 SQL 服务器中的连接运算符 (||) 也不会让你走得太远。

2.

case ... when null 不行。

例如

declare @t table (i int)
insert into @t (i) values (null)
select case i when null then 1 else 2 end as x from @t

+---+
| x |
+---+
| 2 |
+---+

而不是

case x when null then ... when y then ... when z then .. else ... end

你必须使用

case when x is null then ... when x = y then ... when x = z then ... else ... end

您可以试试 CASE 语句吗?

Dim query As String = "
SELECT
docType, 
docyear, 
docmonth, 
TO_CHAR(TO_DATE(docmonth||'/01/2008', 'MM/DD/YYYY'), 'docmonth')) 
CASE
  WHEN docmonth IS NULL THEN NULL
  WHEN docmonth = '0' THEN '- All Months -'
  WHEN docmonth >= AND docmonth <= 12 THEN DATENAME(month, DATEADD(month, docmonth, -1))
END CaseDocMonth,
monthAlpha, 
DID 
FROM dbo.Document
WHERE XALASKAID = '" & LicenseNumber & "'
AND DOCTYPE like '%Report%';"

我已经 written about DECODE before,CASE 通常是首选,因为它更容易阅读,也更灵活。