【问题标题】:same SQL concatenation opeartor for mysql,mssql,oraclemysql、mssql、oracle 的相同 SQL 连接运算符
【发布时间】:2011-12-04 19:40:15
【问题描述】:

我正在尝试对上述三个 DBMS 使用相同的 sql 语句 .. 但问题是它涉及字符串连接,但每个 dbms 中有不同的方式用于连接操作 .. 但我想要单个运算符 .. 需要有人帮忙

【问题讨论】:

  • 不太可能发生,但是您正在尝试/想要的示例会有所帮助
  • Denali 有 CONCAT 函数,但在此之前,在 TSQL 中你会被 + 卡住
  • 是否可以在sql server中定义concat函数..和mysql,oracle中的CONCAT一样
  • @ahmedsaud - 否。SQL Server 中的所有用户定义函数都需要以架构为前缀,以便您可以定义 CONCAT 函数,但您需要将其称为 dbo.CONCAT。此外,UDF 不能采用可变长度参数列表。
  • 你在这里不走运。虽然 MySQL 可以配置为遵循 ANSI 标准并使用|| 作为连接运算符(就像 Oracle 和几乎所有其他 SQL 数据库一样),但没有办法说服 SQL Server 符合标准

标签: mysql sql sql-server oracle plsql


【解决方案1】:

您也许可以在应用程序代码中解决此问题,方法是在 sql 语句中使用占位符进行连接,然后将其替换为您正在使用的 rdbms 的正确样式:

select {conpre} myfield1 {conmid} myfield2 {conmid} myfield3 {conend}
  from mytable

然后在伪代码中:

if rdbms is sqlserver
    conpre = ""
    conmid = " + "
    conend = ""
else if rdbms is mysql
    conpre = "concat("
    conmid = ", "
    conend = ")"
else if rdbms is oracle
    conpre = ""
    conmid = " || "
    conend = ""
else if
    ' etc...
end if

stmt = replace(stmt, "{conpre}", conpre)
stmt = replace(stmt, "{conmid}", conmid)
stmt = replace(stmt, "{conend}", conend)

【讨论】:

  • 对不起...这不是我期望的答案,因为如果这是..那我为什么不在编程中处理这个..
  • 您的“问题”的正确答案是no。只是想我会提供另一个更有帮助的建议。
  • 我认为有可能。看我的回答。
【解决方案2】:

我会避免编写您自己的解决方案来解决问题,而是使用现有的多数据库工具之一。如果您曾经遇到过这个问题,您很快就会再次遇到它。

我与以下没有隶属关系,但您可以尝试Datanamic Multirun

【讨论】:

    【解决方案3】:

    这个问题的简单答案似乎是否定的。

    不过……

    如果您在 Oracle 中创建包 dbo 会怎样? 在mysql中是不是也可以在一个单独的数据库dbo中创建一个叫concat的函数,从而使用语法dbo.concat(a, b, c)来调用一个函数?

    不幸的是,mysql 不支持默认参数(除非最近更改)或函数重载,因此您必须为每个参数数量创建 on 函数:

    concat2(s1, s2)

    concat3(s1, s2, s3)

    等等。

    【讨论】:

      【解决方案4】:

      有一种使用 ODBC 转义序列的方法

      SELECT {fn concat (col1, {fn concat (col2, col3)})}
      FROM YourTable
      

      来自my current understanding,这在 SQL Server 和 MySQL 中可以正常工作,但对于 Oracle,则取决于连接方法。

      【讨论】:

      • @a_horse_with_no_name - 我不太清楚。在 SQL Server 中,它似乎与连接无关。您可以在定义中使用它创建一个存储过程,并在文本本身中为它缓存一个带有fn concat 的计划,而不是在它到达 SQL Server 之前由驱动程序重写。稍后我可能会在 dba.stackexchange.com 上发布有关它的问题
      【解决方案5】:

      MySQL:

         SELECT CONCAT('New ', 'York ', 'City');
      

      输出是:纽约市

      甲骨文:

      SELECT 'The city' || ' is ' || 'Paris' FROM dual;
      

      输出是:城市是巴黎

      SQL 服务器:

      SELECT 'The city' + ' is ' + 'Paris';
      

      输出是:城市是巴黎

       SELECT CONCAT('The city', ' is ', 'Paris');
      

      输出是:城市是巴黎

      【讨论】:

        猜你喜欢
        • 2010-09-24
        • 2013-03-15
        • 2010-11-25
        • 2010-12-23
        • 1970-01-01
        • 2014-08-02
        • 2016-08-11
        • 1970-01-01
        • 2017-06-24
        相关资源
        最近更新 更多