2016-05-11 93 views
0

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

甲骨文,我想转换为:

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)) 

我缺少什么?

回答

0

甲骨文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) 
... 
0

认为这是你想要的。 。 。或至少接近:

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

注:

  • 这假定phonearea和​​是字符串,而不是数字(存储这样的值作为字符串是好的做法反正)。
  • 如果它们是数字,则使用CAST()CONVERT()。但是,请记住包含VARCHAR()的长度。 SQL Server的默认长度为VARCHAR(),并且您不希望依赖于默认长度。
  • STUFF()函数可用于在电话号码中的第3个字符之后插入连字符。我认为这是你想要的逻辑。
  • 您可能需要注意套管。对于大多数字符串操作,SQL Server(默认情况下)不区分大小写,但Oracle是。