Oracle、Postgres、および SQL Server で連結に共通の演算子を使用する方法はありますか。
Oracle と Postgres では を使用||
し、SQL Server ではを使用します+
。
+
文字列連結をサポートするカスタム演算子を追加することで、Postgres の問題を解決しました。
演算子を使用した文字列連結をサポートするために、Oracle に同じ演算子を追加する方法はありますか+
。
Oracle、Postgres、および SQL Server で連結に共通の演算子を使用する方法はありますか。
Oracle と Postgres では を使用||
し、SQL Server ではを使用します+
。
+
文字列連結をサポートするカスタム演算子を追加することで、Postgres の問題を解決しました。
演算子を使用した文字列連結をサポートするために、Oracle に同じ演算子を追加する方法はありますか+
。
||
SQL 標準の連結演算子です (SQL 2008: 5.2 を参照)。それを使用して、使用しているシステムで機能しない場合は文句を言ってください;-)
ただし、真剣に、他のシステムでは||
ではなくを使用する必要があります+
。より標準的であるだけでなく、 を使用する+
と、特に型を推論する必要がある場合や暗黙のキャストが発生している場合に、誤って混乱を招きやすくなります。
検討:'5' + 2
使用しているシステムがそのエラーをスローせず、+
プラスと連結の両方を意味する場合、混乱する結果になる可能性があります。
Oracle では演算子をオーバーロードできません。Oracle は自動型変換 ('1'+'1'=2) を行うため、"+" オーバーロードはとにかく機能しません。
Oracle で使用される連結演算子は です||
。これも ANSI に準拠しています。
CONCAT
(postgres 9.0 および SQL Server 2012 の時点で) 必要な 3 つの RDBMS すべてでサポートされている関数もあります。
の Oracle バージョンはCONCAT
、他の 2 つのように可変長ではないことに注意してください。3 つ以上の文字列を連結する必要がある場合は、ネストする必要があります。
CONCAT(s1,CONCAT(s2,s3))
||
明らかにSQL Serverではありませんが、確かにOracleで動作します。(私たちの後に来る人のために、ここに SQL のロゼッタ ストーンがあります: SQL Dialects Reference )
SQL スクリプトを修正している場合は、次の解決策を検討します。
前:
sql-shell-command < sql-file.sql
(sql-file には「+」演算子が含まれています)
後:
ansi-sql-shell-command < sql-file.sql
sed -e 's/||/\+/' < sql-file.sql | ms-sql-shell-command
(sql-file には||
演算子が含まれているため、ファイルを変換する必要があります)
アイデアは、ある形式の SQL から始めて、特殊なケースでは、それに対してフィルターを実行して、それを別の形式に変換するというものです。理論的には、すべての+
es を||
s に変換できますが、それらのかなりの割合が文字列連結ではなく数値加算である可能性があるため、同様に機能する可能性は低いです。
フィルターの複雑さは、何をしているかによって異なります。SQL に任意のデータがある場合は、文字列への置換を避けるためにそれを取得する必要があります。ただし、ビューを設定している場合は、おそらく問題ありません。
SQL が文字列にあるプログラムでも同じ手法を使用できます。プログラムに関数を記述して、ある形式から別の形式に変換します。