我正在尝试转换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))
我错过了什么?
答案 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)
注意:
phonearea
和phonenbr
是字符串,而不是数字(无论如何,将这些值存储为字符串都是好的做法)。CAST()
或CONVERT()
。但是,请记住包含VARCHAR()
的长度。 SQL Server的默认长度为VARCHAR()
,您不希望依赖于默认长度。STUFF()
功能可用于在电话号码中的第3个字符后插入连字符。我认为这是你的预期逻辑。