20

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

在 Oracle 和 Postgres 中,我们使用||而 SQL Server 使用+.

我通过添加自定义运算符+来支持字符串连接解决了 Postgres 中的问题。

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

4

3 回答 3

37

||是 SQL 标准连接运算符(请参阅 SQL 2008:5.2)。使用它,如果它在您使用的系统中不起作用,请抱怨;-)

不过说真的,你应该让其他系统使用||,而不是+. 它不仅更标准,而且如果使用 更容易意外引起混淆+,尤其是在必须推断任何类型或发生隐式转换的情况下。

考虑:'5' + 2

如果您使用的系统没有在该系统上引发错误,并且+意味着加号和串联,那么您可能会遇到一些令人困惑的结果。

于 2009-09-03T16:29:21.930 回答
23

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

Oracle 使用的连接运算符是||,它也符合 ANSI。

还有一个CONCAT功能(从 postgres 9.0 和 SQL Server 2012 开始)被您需要的所有三个 RDBMS 支持。

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

CONCAT(s1,CONCAT(s2,s3))
于 2009-09-03T13:05:36.623 回答
9

||当然可以在 Oracle 中使用,但显然不是 SQL Server。(对于那些追随我们的人,这里是 SQL 的玫瑰石:SQL 方言参考

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

前:

sql-shell-command < sql-file.sql

(sql 文件包含 '+' 运算符)

后:

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


sed -e 's/||/\+/' < sql-file.sql | ms-sql-shell-command

(sql-file 包含||操作符,你必须转换你的文件)

这个想法是您从一种格式的 SQL 开始,对于特殊情况,您对其运行过滤器以将其转换为另一种格式。从理论上讲,您可以将所有+es 转换为||s,但由于其中很大一部分可能是数字加法而不是字符串连接,因此这不太可能也有效。

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

您可以在 SQL 位于字符串中的程序中使用相同的技术——在程序中编写一个函数以将其从一种形式转换为另一种形式。

于 2009-09-03T13:01:28.360 回答