【问题标题】:Convert Oracle decode statement into SQL Server T-SQL statement将 Oracle decode 语句转换为 SQL Server T-SQL 语句
【发布时间】:2017-01-23 21:21:05
【问题描述】:

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

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%'"

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

【问题讨论】:

  • “我们的重点是将所有查询语句从 oracle 转换为 sql 语句” .... Oracle 使用 SQL 语句!这是什么意思,因为它没有意义?
  • “一些错误” - 愿意分享吗?
  • 所以你是从 VBA 调用查询?你有什么错误?
  • 您是否因为使用 SQL Server(根据 DBO 架构猜测)而在 DECODE 上遇到错误,并且 SQL Server 中不存在 DECODE?
  • 您的问题中没有有效的 SQL 语句。如果您有 SQL 问题,请不要在您的编程语言代码中混淆您的 SQL 语句。 Oracle 还使用 SQL 作为其查询语言,因此您无需转换任何内容

标签: sql sql-server case decode


【解决方案1】:

您可以尝试使用 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 通常是首选,因为它更易于阅读,并且具有更大的灵活性。

【讨论】:

  • 其余工作正常,但 MS SQL 不明白:TO_CHAR(TO_DATE(docmonth||'/01/2008', 'MM/DD/YYYY'), 'docmonth')) 我的列中只有 0 到 12 的值,并试图用文字(月字)而不是数字来显示它。
  • 啊,我明白了。这两个函数也是 Oracle 特有的。我已经阅读了有关获取月份名称的其他 cmets,并且我认为 DATENAME 函数应该可以解决问题。我已经更新了我的答案。我现在无权访问 SQL Server,但如果此查询有任何问题,请告诉我。
  • 感谢您的修改,它的工作真棒!!!!,您的代码对我的转换帮助很大。我的最终脚本现在是:Dim query As String = "SELECT DocType, docyear, CASE WHEN docmonth IS NULL THEN NULL " &amp; _ "WHEN docmonth = '0' THEN '- All Months -' WHEN docmonth &gt;= 1 AND docmonth &lt;= 12 " &amp; _ "THEN DATENAME(month, DATEADD(month, docmonth, -1)) END DocMonth, DID from dbo.Document where XALASKAID = '" &amp; LicenseNumber &amp; "' and DOCTYPE like '%Report%'"
【解决方案2】:

1.

使用 Oracle 的专有函数(DECODETO_CHARTO_DATE)甚至连接运算符(|| ) 在 SQL Server 中不会让您走得太远。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多