2015-08-14 71 views
1

MS SQL服务器工作,我从来没有用过PLSQL,但我最近收到的代码行从同事(见下文):的Oracle/SQL到SQL Server翻译

substr(Field1, 1, 8)||'*'||SUBSTR(Field1, 10, 1) 

我可以很轻松地处理substr - >substring位,但我失去了什么||'*'||的意思/确实;它是串联还是我还没有想到的其他东西?

+1

它的串联。 –

+1

根据上下文的不同,一个问题是Oracle将零长度的VARCHAR和NULL视为同义词,有时会表现为空洞,有时不行。在Oracle中'null ||'*''产生''*'',而在SQL Server上'null +'*''将产生'null'。根据子字符串返回null的机会,您可能会在'coalesce(substring(...),'')'中包装以在SQL Server上获得类似的行为。 –

+0

你的问题中没有PL/SQL代码。 –

回答

1

Oracle中的||运算符(以及@a_horse_with_no_name注释 - 标准ANSI)SQL确实是字符串之间的concatination运算符。在MS SQL Server的SQL中,您只需使用+。所以翻译是:

SUBSTRING(Field1, 1, 8) + '*' + SUBSTRING(Field1, 10, 1) 
+0

谢谢,Mureinik! – eddymc2

+0

@ eddymc2:它实际上不是“Oracle的”串联运算符。 '||'是在SQL标准中定义的运算符。 –

+0

我的印象是“+”是字符串凝聚的标准SQL方式,“||”是Oracle专有的语法。今天学到了新东西。感谢@a_horse_with_no_name。 – Mureinik

1

就像@MarcB说这是串联,|| {string here} ||相当于+concat()在SQL Server:

substring(Field1, 1, 8)+ '*' + substring(Field1, 10, 1) 
+1

谢谢,FutbolFan!祝你好运! – eddymc2

+0

@ eddymc2哈哈,谢谢兄弟! – FutbolFan

0

连接两个字符串的结果是另一个字符 字符串。如果两个字符串的数据类型都是CHAR,则结果为 数据类型为CHAR,并且限制为2000个字符。如果任一字符串是数据类型为VARCHAR2的 ,则结果具有数据类型VARCHAR2,并且将 限制为4000个字符。如果其中一个参数是CLOB,则结果是一个 临时CLOB。无论字符串或CLOB的数据类型如何,字符串中的尾随空白均由 级联保留。

在大多数平台上,连接运算符是两个实心垂直 条,如表4-3所示。但是,某些IBM平台为此操作员使用了断开的 竖条。当在具有不同字符集的系统(例如ASCII和 EBCDIC)之间移动 系统之间的SQL脚本文件时,竖线可能不会被转换为目标Oracle数据库环境所需的竖线 。 Oracle提供 CONCAT字符函数作为竖线 操作符的替代方法,用于操作系统或网络实用程序难以或不可能控制 转换时的情况。在应用程序中使用 此功能将在具有不同字符集的环境 之间移动。

尽管Oracle把零长度字符串作为空值, 串接一个零长度字符串与另一操作数 总是导致其它操作数,所以空只能从 级联两个空字符串的结果。但是,在未来版本的Oracle数据库中,这可能不会延续到 。要连接可能为空的 表达式,请使用NVL函数明确地 将表达式转换为零长度字符串。

source

为了有一个更清晰的源代码,你可以考虑使用CONCAT

这是一个后about perfomance