2009-09-03 13 views
15

Czy istnieje sposób na uzyskanie wspólnego operatora dla konkatenacji w Oracle, Postgres i SQL Server.Operator konkatenacji ciągów w Oracle, Postgres i SQL Server

W Oracle używamy "|", postgres używa '||' a serwer sql używa "+".

Rozwiązałem problem w postgresie, dodając operatora niestandardowego "+" do obsługi łączenia ciągów.

Czy istnieje sposób na dodanie tego samego operatora w Oracle do obsługi łączenia ciągów za pomocą operatora "+".

+0

dlaczego wszystkie bazy danych muszą mieć tę samą składnię? gdyby były takie same, byłby tylko jeden. języki aplikacji mają różną składnię? –

+10

Wszystkie kompilatory języka C analizują tę samą składnię, dlaczego parsery SQL nie powinny robić tego samego? – ijw

+1

SQL Server i Sybase używają języka TSQL, a Oracle używa języka PL/SQL. TSQL jest inny niż PL/SQL. –

Odpowiedz

8

'||' na pewno działa w Oracle, ale nie najwyraźniej SQL Server. (Dla tych, którzy przyjdą po nas, oto kamień z Rosetty dla SQL: SQL Dialects Reference)

Jeśli naprawek skryptów SQL, chciałbym rozważyć następujące rozwiązanie:

Przed:

sql-shell-command < sql-file.sql 

(SQL-plik zawiera operatory '+')

PO:

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


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

(plik sql zawiera operatory "||", musisz przekonwertować pliki)

Pomysł polega na tym, że zaczynasz od SQL w jednym formacie, a w przypadku specjalnym uruchamiasz go, aby przekształć go na inny format. Teoretycznie możesz zamienić wszystkie znaki "+" na "||", ale ponieważ znaczna część z nich może być liczbowa - dodaj zamiast łączenia ciągów, jest mało prawdopodobne, aby działała tak dobrze.

Złożoność filtra zależy od tego, co robisz. Jeśli posiadasz dowolne dane w swoim SQL, musisz je zdobyć, aby uniknąć zastępowania w łańcuchach. Ale jeśli konfigurujesz widoki, prawdopodobnie będzie dobrze.

Można użyć tej samej techniki w programach, w których SQL jest w ciągach - napisać funkcję w programie, aby przekształcić ją z jednej formy w drugą.

+1

nie będzie działał na serwerze sql –

+0

Link nie działa ... = ( –

+1

@Will, afer moja edycja, link działa teraz –

20

Nie można przeciążać operatorów w Oracle. przeciążenie "+" i tak by nie działało, ponieważ Oracle dokonuje automatycznych konwersji typów ("1" + "1" = 2).

Operator konkatenacji używany przez firmę Oracle to ||, który jest również zgodny z ANSI.

Istnieje również funkcja CONCAT, która (od postgres 9.0 i SQL Server 2012) jest obsługiwana przez wszystkie trzy RDBMS, których potrzebujesz.

Należy pamiętać, że wersja Oracle CONCAT nie jest wariantowa jak pozostałe dwa. Jeśli trzeba złączyć trzy lub więcej ciągów trzeba będzie gniazdo:

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

MySQL obsługuje funkcję CONCAT(), ale PostgreSQL i SQL Server nie mają.Nawet, nie po wyjęciu z pudełka: mogą być budowane jako procedur przechowywanych – APC

+1

Problem jest mój bieżący projekt używa "+" jako operator konkatenacji ciąg w większości miejsc.To działa zarówno z postgres ans serwer sql.Teraz chcemy projektu do pracy z Oracle również Właśnie dlatego potrzebuję "+" do pracy w Oracle. Jeśli to nie działa, musimy zmienić większość kodu, w którym używamy "+", do wspólnego operatora "||", jeśli działa we wszystkich miejscach . JA potrzebujemy rozwiązania, które będzie działało w 3 bazach danych bez większych zmian w istniejącym systemie. –

+1

Ta funkcja jest również dostępna w PostgreSQL 9: http://www.postgresql.org/docs/9.1/static/functions-string.html – FGM

25

|| jest operatorem konkatenacji SQL Standard (patrz SQL 2008: 5.2). Użyj tego i narzekaj, jeśli nie działa w systemie, którego używasz ;-)

Poważnie, powinieneś sprawić, by inne systemy używały ||, a nie +.Nie tylko jest bardziej standardowy, ale łatwiej jest przypadkowo wywołać zamieszanie, jeśli używasz +, zwłaszcza, jeśli jakiekolwiek typy muszą zostać wywnioskowane lub gdy są wykonywane niejawne rzuty.

Rozważmy: '5' + 2

Jeśli system używasz nie rzucać błąd na tej jednej, a + oznacza zarówno plus i konkatenacji, może być w przypadku niektórych dziwnych efektów.

+3

Microsoft nie obsługuje tego samego standardu, co wszyscy inni, i powinien złożyć skargę do MS i nakazać im zmianę sposobu działania. Tak, to zadziała ... ;-) – ijw

+7

@ijw, Lub po prostu "uaktualnij" do lepszej bazy danych :) – Cerin

+0

Złóż skargę tutaj: https://connect.microsoft.com/SQLServer/feedback/details/259291/support -iso-9075-standard-string-konkatenacja-podwójna rura – codekaizen

Powiązane problemy