2009-09-03 24 views
15

¿Hay alguna forma de tener un operador común para la concatenación en Oracle, Postgres y SQL Server?Operador de concatenación de cadenas en Oracle, Postgres y SQL Server

En Oracle usamos '|', postgres usa '||' y el servidor sql usa '+'.

He resuelto el problema en postgres agregando el operador personalizado '+' para admitir la concatenación de cadenas.

Hay una manera de agregar el mismo operador en Oracle para admitir la concatenación de cadenas mediante el operador '+'.

+0

¿por qué toda la base de datos debe tener la misma sintaxis? si todos fueran iguales, solo habría uno. todos los lenguajes de aplicación tienen diferente sintaxis? –

+10

Todos los compiladores C analizan la misma sintaxis, ¿por qué los analizadores SQL no deberían hacer lo mismo? – ijw

+1

SQL Server y Sybase usan el lenguaje TSQL y Oracle usa el lenguaje PL/SQL. TSQL es diferente de PL/SQL. –

Respuesta

8

'||' Ciertamente funciona en Oracle, aunque aparentemente no es SQL Server. (Para los que vienen después de nosotros, esto es una piedra de Rosetta para SQL: SQL Dialects Reference)

Si está arreglando scripts SQL, consideraría la siguiente solución:

ANTES:

sql-shell-command < sql-file.sql 

(SQL-archivo contiene '+' operadores)

DESPUÉS:

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


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

(el archivo sql contiene operadores '||', tendría que convertir sus archivos)

La idea es que empiece con SQL en un formato, y para el caso especial, ejecute un filtro sobre él para transformarlo al otro formato. Teóricamente, podría convertir todos los '+' es en '||' s, pero dado que una buena proporción de ellos podría ser de suma numérica en lugar de concatenación de cadena, es poco probable que funcione también.

La complejidad de su filtro depende de lo que esté haciendo. Si tiene datos arbitrarios en su SQL, deberá obtenerlos para evitar sustituirlos por cadenas. Pero si está configurando vistas, probablemente esté bien.

Puede usar la misma técnica en programas donde el SQL está en cadenas: escriba una función en el programa para convertirla de una forma a otra.

+1

no funcionará en SQL cortar –

+0

no parece El enlace a trabajar ... = ( –

+1

@Will, afer mi edición, el enlace funciona ahora –

20

No se pueden sobrecargar los operadores en Oracle. la sobrecarga "+" no funcionaría de todos modos, ya que Oracle realiza conversiones automáticas de tipo ('1' + '1' = 2).

El operador de concatenación utilizado por Oracle es ||, que también es compatible con ANSI.

También existe la función CONCAT que (a partir de postgres 9.0 y SQL Server 2012) es compatible con los tres RDBMS para los que lo necesita.

Tenga en cuenta que la versión de Oracle de CONCAT no es variada como las otras dos. Si necesita concatenar tres o más cadenas que se necesita para anidar:

CONCAT(s1,CONCAT(s2,s3)) 
+4

MySQL soporta la función CONCAT(), pero PostgreSQL y SQL Server no hacer por lo menos, no está fuera de la caja!..: que podrían construirse como procedimientos almacenados. – APC

+1

el problema es utiliza mi proyecto actual '+' como el operador de concatenación de cadenas en la mayoría de los lugares. es sirve para las postgres American National Standard de SQL Server. Ahora queremos que el proyecto funcione con Oracle también . Es por eso que necesito '+' para trabajar en Oracle. Si no funciona, tenemos que cambiar la mayor parte de nuestro código donde usamos '+', a un operador común '||' si funciona en todos los lugares . YO necesita una solución que trabajará en las 3 bases de datos sin muchos cambios en el sistema existente –

+1

Esta función también está disponible en PostgreSQL 9: http://www.postgresql.org/docs/9.1/static/functions-string.html – FGM

25

|| es el operador de concatenación estándar SQL (vea SQL 2008: 5,2). Úselo y pregúntese si no funciona en el sistema que está utilizando ;-)

En serio, debe hacer que otros sistemas usen ||, no +.No solo es más estándar, sino que es más fácil causar confusión accidentalmente si usa +, especialmente si se deben inferir o se están produciendo moldes implícitos.

considerar: '5' + 2

Si el sistema que está utilizando no generará un error en que uno, y + significa a la vez más y la concatenación, es posible que en algunos resultados confusos.

+3

Por lo tanto, Microsoft no admite el mismo estándar que todos los demás, y debe quejarse a MS y decirles que cambien sus formas. Sí, eso funcionará ... ;-) – ijw

+7

@ijw, o simplemente "ascenso" para una mejor base de datos :) – Cerin

+0

Quejarse aquí: https://connect.microsoft.com/SQLServer/feedback/details/259291/support -iso-9075-standard-string-concatenation-double-pipe – codekaizen