2009-09-03 11 views
15

C'è un modo per avere un operatore comune per la concatenazione in Oracle, Postgres e SQL Server.Operatore di concatenamento di stringhe in Oracle, Postgres e SQL Server

In Oracle viene utilizzato '|', postgres utilizza '||' e il server sql usa '+'.

Ho risolto il problema in postgres aggiungendo l'operatore personalizzato '+' per supportare la concatenazione di stringhe.

C'è un modo per aggiungere lo stesso operatore in Oracle per supportare la concatenazione di stringhe usando l'operatore '+'.

+0

perché tutti i database devono avere la stessa sintassi? se fossero tutti uguali, ce ne sarebbe solo uno. i linguaggi di applicazione hanno tutti una sintassi diversa? –

+10

Tutti i compilatori C analizzano la stessa sintassi, perché i parser SQL non dovrebbero fare lo stesso? – ijw

+1

SQL Server e Sybase utilizzano il linguaggio TSQL e Oracle utilizza il linguaggio PL/SQL. TSQL è diverso da PL/SQL. –

risposta

8

'||' sicuramente funziona in Oracle, anche se non apparentemente SQL Server. (Per coloro che verranno dopo di noi, ecco una stele di rosetta per SQL: SQL Dialects Reference)

Se si sta sistemando script SQL, vorrei prendere in considerazione la seguente soluzione:

PRIMA:

sql-shell-command < sql-file.sql 

(sql-file contiene '+' operatori)

DOPO:

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


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

(sql-file contiene '||' operatori, dovresti convertire i tuoi file)

L'idea è che si inizia con SQL in un formato, e per il caso speciale, si esegue un filtro su di esso per trasformalo nell'altro formato. In teoria, è possibile trasformare tutti i '+' in '||' s, ma dal momento che una buona parte di quelli potrebbe essere numerica-addiziona piuttosto che concatenazione di stringhe, è improbabile che funzioni altrettanto bene.

La complessità del filtro dipende da ciò che si sta facendo. Se hai dati arbitrari nel tuo SQL, dovresti ottenerlo per evitare la sostituzione nelle stringhe. Ma se stai impostando le visualizzazioni, probabilmente andrà bene.

È possibile utilizzare la stessa tecnica nei programmi in cui l'SQL è in stringhe: scrivere una funzione nel programma per trasformarla da una forma all'altra.

+1

non funziona su sql sever –

+0

Il collegamento sembra non funzionare ... = ( –

+1

@Will, dopo la mia modifica, il link funziona ora –

20

Non è possibile sovraccaricare gli operatori in Oracle. il sovraccarico "+" non funzionerebbe comunque, dal momento che Oracle esegue conversioni di tipo automatico ('1' + '1' = 2).

L'operatore di concatenazione utilizzato da Oracle è ||, anch'esso conforme ANSI.

Esiste anche la funzione CONCAT che (a partire da Postgres 9.0 e SQL Server 2012) è supportata da tutti e tre gli RDBMS necessari.

Si noti che la versione Oracle di CONCAT non è variadica come le altre due. Se avete bisogno di concatenare tre o più stringhe sarà necessario nido:

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

MySQL supporta la funzione CONCAT() ma PostgreSQL e SQL Server no. Almeno, non appena estratto dalla confezione: possono essere compilati come stored procedure – APC

+1

Il problema è che il mio progetto attuale utilizza '+' come operatore di concatenazione di stringhe nella maggior parte dei luoghi. Funziona con server Postgres e SQL Server. Ora vogliamo che il progetto funzioni anche con Oracle Per questo ho bisogno di + lavorare in Oracle, se non funziona, dobbiamo cambiare la maggior parte del nostro codice dove usiamo '+', per un operatore comune '||' se funziona in tutti i posti . IO bisogno di una soluzione che funzioni nei 3 database senza molte modifiche nel sistema esistente –

+1

Questa funzione è disponibile anche in PostgreSQL 9: http://www.postgresql.org/docs/9.1/static/functions-string.html – FGM

25

|| è lo SQL standard operatore di concatenazione (vedi SQL 2008: 5,2). Usalo e lamentati se non funziona nel sistema che stai usando ;-)

Seriamente, dovresti fare in modo che altri sistemi utilizzino ||, non +.Non solo è più standard, ma è più facile causare accidentalmente confusione se si utilizza +, in particolare se è necessario dedurre qualsiasi tipo o se si verificano conversioni implicite.

considerare: '5' + 2

Se il sistema che si sta utilizzando non genera un errore su quello, e + significa sia più e la concatenazione, si potrebbe essere in per alcuni risultati confusi.

+3

Quindi, Microsoft non supporta lo stesso standard di tutti gli altri, e dovrebbe lamentarsi con MS e dire loro di cambiare i loro modi. Sì, funzionerà ... ;-) – ijw

+7

@ijw, O semplicemente "upgrade" ad un database migliore :) – Cerin

+0

Protesta qui: https://connect.microsoft.com/SQLServer/feedback/details/259291/support -iso-9075-standard stringa concatenazione-a doppio tubo – codekaizen

Problemi correlati