Oracle,Postgres和SQL Server中的字符串连接运算符

Aru*_*hny 16 database sql-server oracle postgresql

有没有办法在Oracle,Postgres和SQL Server中使用通用运算符进行连接.

在Oracle中我们使用'|',postgres使用'||' 和sql server使用'+'.

我通过添加自定义运算符'+'来支持字符串连接,从而解决了postgres中的问题.

有没有办法在Oracle中添加相同的运算符以支持使用'+'运算符进行字符串连接.

Jef*_*vis 29

||是SQL Standard连接运算符(请参阅SQL 2008:5.2).使用它,并抱怨,如果它在你正在使用的系统中不起作用;-)

说真的,你应该使用其他系统||,而不是+.它不仅更标准,而且如果你使用它会更容易意外地引起混淆+,特别是如果必须推断任何类型或者发生隐式转换.

考虑: '5' + 2

如果您正在使用的系统不会在该系统上引发错误,并且+意味着加号和连接,那么您可能会遇到一些令人困惑的结果.

  • @ijw,或者只是"升级"到更好的数据库:) (7认同)
  • 因此,微软不支持与其他人相同的标准,他应该向MS投诉并告诉他们改变他们的方式.是的,那会工作...... ;-) (3认同)

Vin*_*rat 22

您不能在Oracle中重载运算符."+"重载无论如何都不会起作用,因为Oracle会进行自动类型转换('1'+'1'= 2).

Oracle使用的串联运算符||也符合ANSI标准.

还有一个CONCAT功能(如postgres 9.0和SQL Server 2012)由你需要的所有三个RDBMS支持.

请注意,Oracle版本CONCAT不像其他两个版本那样是可变的.如果需要连接三个或更多字符串,则需要嵌套:

CONCAT(s1,CONCAT(s2,s3))
Run Code Online (Sandbox Code Playgroud)

  • @APC [`CONCAT()`在SQL Server 2012中添加](http://msdn.microsoft.com/en-us/library/hh231515(v = sql.110).aspx). (6认同)

ijw*_*ijw 9

'||' 当然可以在Oracle中运行,但显然不是SQL Server.(对于那些追随我们的人来说,这里是SQL的一个问题:SQL方言参考)

如果您正在修复SQL脚本,我会考虑以下解决方案:

之前:

sql-shell-command < sql-file.sql
Run Code Online (Sandbox Code Playgroud)

(sql-file包含'+'运算符)

后:

ansi-sql-shell-command < sql-file.sql


sed -e 's/||/\+/' < sql-file.sql | ms-sql-shell-command
Run Code Online (Sandbox Code Playgroud)

(sql-file包含'||'运算符,你必须转换你的文件)

我们的想法是以一种格式开始使用SQL,对于特殊情况,您可以在其上运行过滤器以将其转换为其他格式.从理论上讲,你可以把所有'+'es变成'||',但由于其中很大一部分可能是数字加法而不是字符串连接,所以这不太可行.

过滤器的复杂性取决于您正在做什么.如果你的SQL中有任意数据,那么你必须得到它以避免在字符串中替换.但如果你正在设置意见,它可能会很好.

您可以在SQL所在的程序中使用相同的技术 - 在程序中编写一个函数,将其从一种形式转换为另一种形式.