Оператор конкатенации строк в Oracle, Postgres и SQL Server

Есть ли способ иметь общий оператор для конкатенации в Oracle, Postgres и SQL Server.

В Oracle мы используем '|', postgres использует '||' и сервер sql использует "+" .

Я решил проблему в postgres, добавив пользовательский оператор "+" для поддержки конкатенации строк.

Есть ли способ добавить тот же оператор в Oracle для поддержки конкатенации строк с помощью оператора "+" .

Ответы

Ответ 1

|| - это оператор конкатенации SQL Standard (см. SQL 2008: 5.2). Используйте это и жалуйтесь, если он не работает в системе, которую вы используете; -)

Серьезно, однако, вы должны использовать другие системы ||, а не + . Это не только стандартизировано, но и проще случайно вызвать путаницу, если вы используете + , особенно если какие-либо типы должны быть выведены или неявные отбрасывания происходят.

Рассмотрим: '5' + 2

Если используемая вами система не выдает ошибку на этом, а + означает как плюс, так и конкатенацию, вы можете столкнуться с некоторыми запутывающими результатами.

Ответ 2

Вы не можете перегружать операторы в Oracle. перегрузка "+" не будет работать в любом случае, поскольку Oracle делает автоматические преобразования типов ('1' + '1' = 2).

Оператором конкатенации, используемым Oracle, является ||, который также совместим с ANSI.

Существует также функция CONCAT, которая (начиная с postgres 9.0 и SQL Server 2012) поддерживается всеми тремя РСУБД, для которых она нужна.

Обратите внимание, что версия Oracle CONCAT не является вариационной, как две другие. Если вам нужно объединить три или более строки, вам нужно будет вложить:

CONCAT(s1,CONCAT(s2,s3))

Ответ 3

'||' конечно работает в Oracle, хотя, по-видимому, не SQL Server. (Для тех, кто идет за нами, вот камень розетки для SQL: Справочник по диалогам SQL)

Если вы исправляете SQL-скрипты, я бы рассмотрел следующее решение:

ПЕРЕД:

sql-shell-command < sql-file.sql

(sql файл содержит операторы "+" )

ПОСЛЕ:

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


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

(sql файл содержит операторы "||", вам придется конвертировать ваши файлы)

Идея состоит в том, что вы начинаете с SQL в одном формате, а для специального случая вы запускаете фильтр поверх него, чтобы преобразовать его в другой формат. Теоретически, вы могли бы превратить все "+" в "||", но так как хорошая доля из них может быть числовой, а не строковой конкатенацией, это вряд ли сработает.

Сложность вашего фильтра зависит от того, что вы делаете. Если у вас есть произвольные данные в вашем SQL, тогда вам придется заставить его избегать замены строк. Но если вы настраиваете представления, это, вероятно, будет хорошо.

Вы можете использовать ту же технику в программах, где SQL находится в строках, - написать функцию в программе, чтобы превратить ее из одной формы в другую.