vote up 3 vote down star
3

Is there a way to have a common operator for concatenation in Oracle, Postgres and SQL Server.

In Oracle we uses '|', postgres uses '||' and sql server uses '+'.

I've solved the problem in postgres by adding the custom operator '+' to support string concatenation.

Is there a way to add the same operator in Oracle to support string concatenation using the '+' operator.

flag

75% accept rate
why do all database have to have the same syntax? if they were all the same, there would only be one. application languages all have different syntax? – KM Sep 3 at 13:16
All C compilers parse the same syntax, why shouldn't SQL parsers do the same? – ijw Sep 3 at 13:23
SQL Server and Sybase use the TSQL language and Oracle uses the PL/SQL language. TSQL is different than PL/SQL. – KM Sep 3 at 13:39
Yes, but concatenation is part of boring old SQL, not the procedural language that goes with it. It's even defined in ANSI SQL (as ||). T-SQL and PL/SQL (and the others) have SQL DML as a subset, but both of them deviate from the ANSI standard. – ijw Sep 3 at 14:21
both contain loads of nice features that go beyond ANSI SQL, should these be removed so they conform to the standard? It is kind of like what IE did, close enough to the standard, but different enough that switching will be hard. – KM Sep 3 at 15:37

3 Answers

vote up 4 vote down

Hi Arun,

You can't overload operators in Oracle. the "+" overload wouldn't work anyway, since Oracle does automatic type conversions ('1'+'1'=2).

The concatenation operator used by Oracle is ||, which is also ANSI-compliant.

There is also the CONCAT function in Oracle and MySQL, I don't know if it exists in other RDBMS but if it does, you could use it to have portable queries.

link|flag
3  
MySQL supports the CONCAT() function but PostgreSQL and SQL Server don't. At least, not out of the box: they could be built as stored procedures. – APC Sep 3 at 13:14
1  
The problem is my current project uses '+' as the string concatenation operator in most of the places. It is works with both postgres ans sql server. Now we want the project to work with oracle also. That is why I need '+' to work in Oracle. If it is not working then we have to change most of our code where we uses '+', to a common operator '||' if it works in all the places. I need a solution which will work in the 3 databases without much changes in the existing system – Arun P Johny Sep 4 at 1:24
vote up 4 vote down

|| is the SQL Standard concatenation operator (see SQL 2008: 5.2). Use that, and complain if it doesn't work in the system you're using ;-)

Seriously though, you should make other systems use ||, not +. Not only is it more standard, but it's easier to accidentally cause confusion if you use +, especially if any types have to be inferred or and implicit casts are happening.

Consider: '5' + 2

If the system you're using doesn't throw an error on that one, and + means both plus and concatenation, you might be in for some confusing results.

link|flag
So, Microsoft don't support the same standard as everyone else, and he should complain to MS and tell them to change their ways. Yeah, that'll work... ;-) – ijw Sep 4 at 14:26
vote up 3 vote down

'||' certainly works in Oracle, though not apparently SQL Server. (For those who come after us, here's a rosetta stone for SQL: SQL Dialects Reference)

If you're fixing up SQL scripts, I would consider the following solution:

BEFORE:

sql-shell-command < sql-file.sql

(sql-file contains '+' operators)

AFTER:

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


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

(sql-file contains '||' operators, you'd have to convert your files)

The idea is that you start with SQL in one format, and for the special case, you run a filter over it to transform it to the other format. Theoretically, you could turn all '+'es into '||'s, but since a good proportion of those might be numeric-add rather than string-concatenation, that's unlikely to work as well.

The complexity of your filter depends on what you're doing. If you have arbitrary data in your SQL, then you'd have to get it to avoid substituting in strings. But if you're setting up views it'll probably be fine.

You could use the same technique in programs where the SQL is in strings - write a function in the program to turn it from one form to the other.

link|flag
1  
will not work on sql sever – KM Sep 3 at 13:15
The link doesn't seem to work... =( – Will Marcouiller Sep 3 at 13:34
@Will, afer my edit, the link works now – KM Sep 3 at 13:48
1  
+1, that link is great! – KM Sep 3 at 13:49

Your Answer

Get an OpenID
or
never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.