将Oracle代码转换为TSQL

时间:2016-05-11 20:00:38

标签: sql oracle11g

我正在尝试转换Oracle(PLSQL)代码以使用SQL Server 2012数据库。我正在转换Oracle NVL 2功能。我在SQL状态中得到错误,isNULL需要2个参数。

我想转换的Oracle是:

CASE WHEN LTrim(Rtrim(appointtype1)) in ('PRO','NOA') 
      THEN Nvl2(d.phonearea,To_Char(d.phonearea)||'/','')||' '||SubStr(To_Char(d.phonenbr ),1,3)||'-'||SubStr(d.phonenbr,-4)

我修改了SQL,如下所示:

CASE WHEN LTrim(Rtrim(appointtype1)) in ('PRO','NOA') 
       THEN ISNULL((d.phonearea,CAST(d.phonearea AS char)+'/','')+' '+SubString(CAST(d.phonenbr AS char),1,3)+'-'+SubString(d.phonenbr,-4))

我错过了什么?

2 个答案:

答案 0 :(得分:0)

Oracle的NVL2(expr1, expr2, expr3转换为标准SQL CASE WHEN expr1 IS NOT NULL THEN expr2 ELSE expr3 END

CASE WHEN LTrim(Rtrim(appointtype1)) in ('PRO','NOA') 
      THEN CASE WHEN d.phonearea IS NOT NULL
                THEN To_Char(d.phonearea)||'/' 
                ELSE ''
           END ||' '||SubStr(To_Char(d.phonenbr ),1,3)||'-'||SubStr(d.phonenbr,-4)
...

答案 1 :(得分:0)

认为这就是你想要的。 。 。或者至少关闭:

(CASE WHEN LTrim(Rtrim(appointtype1)) IN ('PRO', 'NOA')
      THEN COALESCE(d.phonearea + '/', '') + STUFF(d.phonenbr, 3, 0, '-') 
 END)

注意:

  • 这假设phoneareaphonenbr是字符串,而不是数字(无论如何,将这些值存储为字符串都是好的做法)。
  • 如果是数字,请使用CAST()CONVERT()。但是,请记住包含VARCHAR()的长度。 SQL Server的默认长度为VARCHAR(),您不希望依赖于默认长度。
  • STUFF()功能可用于在电话号码中的第3个字符后插入连字符。我认为这是你的预期逻辑。
  • 您可能需要注意套管。对于大多数字符串操作,SQL Server(默认情况下)不区分大小写,但Oracle是。