PREPARATION
受験対策

オススメ!OSS-DB情報

第2回 文字列リテラル

「リテラル(literal)」という言葉はあまり聞き慣れないかもしれません。簡単に言うと「定数」のことです。
厳密には、定数の方がより広義な概念で、リテラルは定数の一部なのですが、SQL ではリテラルと定数は同じであると考えて構いません。
数値を表す 123、文字列を表す 'abcde'、日付を表す '2012-02-14'、これらはいずれもリテラルの例です。

SQL の文字列リテラルは、引用符(')で囲います。
C や Java など多くのプログラム言語では、文字列リテラルに二重引用符(")を使いますが、SQL の文字列リテラルは一重の引用符(二重引用符は文字列リテラルには使えない)なので混乱しないように気をつけてください。

文字列リテラルの中に引用符を入れたいときは、引用符を2つ続けます。
例えば、'I don''t know.' とすれば、これは
I don't know.
という文字列を表すリテラルになります。
この文字列リテラルがデータベースによってどのように解釈されているかは、 psql でデータベースに接続して、
select 'I don''t know.';
を実行してみればわかります。

PostgreSQL にはタグを使った独自の文字列リテラルの表記法があります。文字列の先頭と最後に $tag$ (ただしtagは任意の文字列、先頭と最後で同じ文字列にする)をつけることで、それらに囲まれた文字列を表現することができます。
タグは省略できて、$$ としても構いません。
以下はいずれも、「I don't know.」という文字列を表すリテラルです。

'I don''t know.'
$$I don't know.$$
$X$I don't know.$X$
$abc$I don't know.$abc$

これも、psql でデータベースに接続して、
select $$I don't know.$$;
を実行してみれば、その意味が理解できるでしょう。特に、CREATE FUNCTION による関数定義では、このタグを使った表記を使うのが便利です。

文字列リテラルに関する他の RDBMS との動作の違いの重要な点に空文字列の扱いがあります。PostgreSQL を含め、多くの RDBMS では、空の文字列('')と NULL は別のものです。これは psql でデータベースに接続して
select 1 where '' = '';
select 1 where '' is null;
を実行してみれば、「別のものである」ということの意味がわかるでしょう。
ところが Oracle では、空文字列と NULL は同じものとして扱われます。上と同じ SELECT 文を Oracle のデータベースに SQL*Plus で接続して実行する(ただし、Oracle では FROM 句が必須なので、"from dual"を"where"の前に挿入します)と、結果が逆になります。
この違いの影響範囲は意外と大きく、単に WHERE 句の条件に気をつけるだけではすみません。
文字列結合をする || 演算子の動作を比較すると、
select 'abcde' || '';
の結果は、PostgreSQL でも Oracle でも 'abcde' で同じですが、
select 'abcde' || null;
の結果は、PostgreSQL では NULL、Oracle では 'abcde' になります。
例えば、人の名前を表示するときに、
SELECT first_name || ' ' || middle_name || ' ' || last_name FROM emp;
などという SELECT 文を使うかもしれません。middle_name が空文字列であれば問題ありませんが、NULL になっているとしたら、結果が NULL にならないように SELECT 文を工夫する必要があります。

解説:松田神一

応募者全員プレゼント!
オープンソース データベース標準教科書 -PostgreSQL-