用于mysql、mssql和oracle的相同SQL连接操作器
我试图对上述三个DBMS使用相同的sql语句。。但问题是它涉及字符串连接,但在每个dbms中有不同的连接操作方式。。但是我想要一个接线员。。需要他人的帮助您可以在应用程序代码中绕过此问题,方法是在sql语句中使用一个用于连接的占位符,然后将其替换为您正在使用的rdbms的正确样式:用于mysql、mssql和oracle的相同SQL连接操作器,mysql,sql,sql-server,oracle,plsql,Mysql,Sql,Sql Server,Oracle,Plsql,我试图对上述三个DBMS使用相同的sql语句。。但问题是它涉及字符串连接,但在每个dbms中有不同的连接操作方式。。但是我想要一个接线员。。需要他人的帮助您可以在应用程序代码中绕过此问题,方法是在sql语句中使用一个用于连接的占位符,然后将其替换为您正在使用的rdbms的正确样式: select {conpre} myfield1 {conmid} myfield2 {conmid} myfield3 {conend} from mytable 然后在伪代码中: if rdbms is s
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)
您可以在应用程序代码中绕过此问题,方法是在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)
我不会为这个问题编写自己的解决方案,而是使用已有的多数据库工具之一。如果你曾经遇到过这个问题,你很快就会再次遇到它
我与以下内容无关,但您可以尝试我会避免编写您自己的问题解决方案,并使用现有的多数据库工具之一。如果你曾经遇到过这个问题,你很快就会再次遇到它
我与以下内容无关,但你可以试试看。这个问题的简单答案似乎是否定的 然而 如果在Oracle中创建包dbo会怎么样? 在mysql中,是否也可以在单独的数据库dbo中创建名为concat的函数,以便使用语法dbo.concat(a、b、c)调用函数 不幸的是,mysql不支持默认参数(除非最近更改)或函数重载,因此您必须为每个参数创建on函数: 混凝土2(s1、s2) 混凝土3(s1、s2、s3)
等等。这个问题的简单答案似乎是否定的 然而 如果在Oracle中创建包dbo会怎么样? 在mysql中,是否也可以在单独的数据库dbo中创建名为concat的函数,以便使用语法dbo.concat(a、b、c)调用函数 不幸的是,mysql不支持默认参数(除非最近更改)或函数重载,因此您必须为每个参数创建on函数: 混凝土2(s1、s2) 混凝土3(s1、s2、s3)
等等。有一种方法可以使用ODBC转义序列来实现这一点
SELECT {fn concat (col1, {fn concat (col2, col3)})}
FROM YourTable
因此,在SQL Server和MySQL中可以很好地工作,但对于Oracle来说,这取决于连接方法。有一种使用ODBC转义序列的方法
SELECT {fn concat (col1, {fn concat (col2, col3)})}
FROM YourTable
因此,在SQL Server和MySQL中可以很好地工作,但Oracle依赖于连接方法。MySQL:
SELECT CONCAT('New ', 'York ', 'City');
SELECT 'The city' + ' is ' + 'Paris';
产出为:纽约市
甲骨文:
SELECT 'The city' || ' is ' || 'Paris' FROM dual;
输出是:城市是巴黎
SELECT CONCAT('The city', ' is ', 'Paris');
SQL Server:
SELECT CONCAT('New ', 'York ', 'City');
SELECT 'The city' + ' is ' + 'Paris';
输出是:城市是巴黎
SELECT CONCAT('The city', ' is ', 'Paris');
输出为:城市是巴黎MySQL:
SELECT CONCAT('New ', 'York ', 'City');
SELECT 'The city' + ' is ' + 'Paris';
SELECT CONCAT('The city', ' is ', 'Paris');
产出为:纽约市
甲骨文:
SELECT 'The city' || ' is ' || 'Paris' FROM dual;
输出是:城市是巴黎
SELECT CONCAT('The city', ' is ', 'Paris');
SQL Server:
SELECT CONCAT('New ', 'York ', 'City');
SELECT 'The city' + ' is ' + 'Paris';
输出是:城市是巴黎
SELECT CONCAT('The city', ' is ', 'Paris');
输出结果是:巴黎城不太可能发生,但您正在尝试/想要的一个例子将有助于Denali使用
CONCAT
函数,但在此之前,在TSQL中,您一直使用+
是否可以在sql server中定义CONCAT函数。。与mysql中的CONCAT相同,oracle@ahmedsaud-否。SQL Server中的所有用户定义函数都需要以架构作为前缀,这样您就可以定义CONCAT
函数,但需要将其称为dbo.CONCAT
。此外,UDF不能获取可变长度的参数列表。您在这里运气不好。虽然MySQL可以配置为遵循ANSI标准,并使用|
作为连接运算符(就像Oracle和几乎所有其他SQL数据库一样),但无法说服SQL Server遵守标准,但是,您正在尝试/想要的一个示例将有助于Denali使用CONCAT
函数,但在此之前,在TSQL中,您一直使用+
是否可以在sql server中定义CONCAT函数。。与mysql中的CONCAT相同,oracle@ahmedsaud-否。SQL Server中的所有用户定义函数都需要以架构作为前缀,这样您就可以定义CONCAT
函数,但需要将其称为dbo.CONCAT
。此外,UDF不能获取可变长度的参数列表。您在这里运气不好。尽管MySQL可以配置为遵循ANSI标准并使用| |
作为连接运算符(就像Oracle和几乎所有其他SQL数据库一样),但无法说服SQL Server遵守标准。。。这不是我所期望的答案,好像这是。。那么我为什么不在编程中处理这个问题呢..你的“问题”的正确答案是否
。我想我会提供另一个建议来帮助你。我想这是可能的。看看我的答案。对不起。。。这不是我所期望的答案,好像这是。。那么我为什么不在编程中处理这个问题呢..你的“问题”的正确答案是否
。我想我会提供另一个建议来帮助你。我想这是可能的。看看我的答案。@a_马_没有名字-我不知道确切的答案。在SQL Server中,连接似乎是不可知的。您可以在定义中使用它创建一个存储过程,它在文本本身中使用fn concat
为它缓存一个计划,而不是在到达SQL Server之前由驱动程序重写。我可能会在dba.stackexchange.com上发布一个关于它的问题later@a_horse_with_no_name-我不太清楚。在SQL Server中,连接似乎是不可知的。您可以在定义中使用它创建一个存储过程,它会在文本本身中使用fn concat
为它缓存一个计划,而不是由驱动程序重写
SELECT CONCAT('The city', ' is ', 'Paris');