2016.12.08 Thursday
使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
本エントリはFirebird Adventcalendar 2016の8日目です。
使い慣れたSQLに潜む実装依存:2.データ型と演算子 文字列の結合演算子
Firebirdの場合、ここでの多数を占めるように結果はNULLとなります。
またCONCAT関数はありません。
SQL> select null || 'ABC' from rdb$database;
CONCATENATION
=============
<null>
SQL> select concat(null,'ABC') from rdb$database;
Statement failed, SQLSTATE = 39000
Dynamic SQL Error
-SQL error code = -804
-Function unknown
-CONCAT
文字列の結合で片方がNULLの場合に、結果がNULLになるのは当然の結果で、
NULLにならないOracle DBとSQL Serverが「おかしい」のですが、
これはNULLを特別視する両者の歴史的な理由によるものだと思います。
NULLとの戦いRDBMS実装編
なお、しのださんの資料でMySQLの||は論理和ということですが、
mysql> select null || 'abc';
+---------------+
| null || 'abc' |
+---------------+
| NULL |
+---------------+
1 row in set, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'abc' |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)
sql_modeにpipes_as_concatを設定すれば、||をconcatとして利用できます。
まぁ結果は同じくNULLなんですけどね。
mysql> set sql_mode='pipes_as_concat';
Query OK, 0 rows affected (0.00 sec)
mysql> select null || 'abc';
+---------------+
| null || 'abc' |
+---------------+
| NULL |
+---------------+
1 row in set (0.00 sec)
文字列結合、後は結合結果がどの型で戻るか、オーバーフローエラーが
あるか、というのは各RDBMSとバージョンにより違うと思います。
みなさんお使いのもので確認してみてください。ちなみにFirebirdは以下です。
|| (string concatenator)
使い慣れたSQLに潜む実装依存:2.データ型と演算子 文字列の結合演算子
Firebirdの場合、ここでの多数を占めるように結果はNULLとなります。
またCONCAT関数はありません。
SQL> select null || 'ABC' from rdb$database;
CONCATENATION
=============
<null>
SQL> select concat(null,'ABC') from rdb$database;
Statement failed, SQLSTATE = 39000
Dynamic SQL Error
-SQL error code = -804
-Function unknown
-CONCAT
文字列の結合で片方がNULLの場合に、結果がNULLになるのは当然の結果で、
NULLにならないOracle DBとSQL Serverが「おかしい」のですが、
これはNULLを特別視する両者の歴史的な理由によるものだと思います。
NULLとの戦いRDBMS実装編
なお、しのださんの資料でMySQLの||は論理和ということですが、
mysql> select null || 'abc';
+---------------+
| null || 'abc' |
+---------------+
| NULL |
+---------------+
1 row in set, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'abc' |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)
sql_modeにpipes_as_concatを設定すれば、||をconcatとして利用できます。
まぁ結果は同じくNULLなんですけどね。
mysql> set sql_mode='pipes_as_concat';
Query OK, 0 rows affected (0.00 sec)
mysql> select null || 'abc';
+---------------+
| null || 'abc' |
+---------------+
| NULL |
+---------------+
1 row in set (0.00 sec)
文字列結合、後は結合結果がどの型で戻るか、オーバーフローエラーが
あるか、というのは各RDBMSとバージョンにより違うと思います。
みなさんお使いのもので確認してみてください。ちなみにFirebirdは以下です。
|| (string concatenator)
JUGEMテーマ:コンピュータ