【问题标题】:String concatenation operator in Oracle, Postgres and SQL ServerOracle、Postgres 和 SQL Server 中的字符串连接运算符
【发布时间】:2010-11-25 06:52:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 为什么所有数据库都必须具有相同的语法?如果它们都一样,那就只有一个。应用程序语言都有不同的语法?
  • 所有 C 编译器解析相同的语法,为什么 SQL 解析器不应该这样做?
  • SQL Server 和 Sybase 使用 TSQL 语言,Oracle 使用 PL/SQL 语言。 TSQL 不同于 PL/SQL。
  • 是的,但是连接是无聊的旧 SQL 的一部分,而不是与之配套的过程语言。它甚至在 ANSI SQL 中定义(如 ||)。 T-SQL 和 PL/SQL(以及其他)将 SQL DML 作为子集,但它们都偏离了 ANSI 标准。
  • @KM:Oracle 将 PL/SQL 用于存储过程。其他一切都是“SQL”。与 SQL Server 不同,Oracle 对查询语言 (SQL) 和过程语言 (PL/SQL) 进行了明确区分

标签: sql sql-server oracle postgresql string-concatenation


【解决方案1】:

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

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

考虑:'5' + 2

如果您使用的系统没有在该系统上引发错误,并且+ 表示加号和连接,您可能会遇到一些令人困惑的结果。

【讨论】:

【解决方案2】:

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

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

还有 CONCAT 函数(从 postgres 9.0 和 SQL Server 2012 开始)您需要的所有三个 RDBMS 都支持它。

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

CONCAT(s1,CONCAT(s2,s3))

【讨论】:

  • 问题是我当前的项目在大多数地方都使用'+'作为字符串连接运算符。它适用于 postgres 和 sql 服务器。现在我们希望该项目也可以与 oracle 一起使用。这就是为什么我需要 '+' 才能在 Oracle 中工作。如果它不起作用,那么我们必须将我们使用“+”的大部分代码更改为通用运算符“||”如果它在所有地方都有效。我需要一个可以在 3 个数据库中工作的解决方案,而无需对现有系统进行太多更改
  • PostgreSQL 9 也有这个功能:postgresql.org/docs/9.1/static/functions-string.html
【解决方案3】:

|| 当然可以在 Oracle 中工作,但显然不是 SQL Server。 (对于那些追随我们的人,这里有一块用于 SQL 的玫瑰石:SQL Dialects Reference

如果您要修复 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 位于字符串中的程序中使用相同的技术 - 在程序中编写一个函数将其从一种形式转换为另一种形式。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多