将 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 的专有函数(DECODE、TO_CHAR 和 TO_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 通常是首选,因为它更容易阅读,也更灵活。
当不再使用 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 的专有函数(DECODE、TO_CHAR 和 TO_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 通常是首选,因为它更容易阅读,也更灵活。