今回は、Silverの「S3 開発/SQL - S3.2 組み込み関数(文字列演算子)」からの出題です。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
例題公開日:2011年9月20日
正解はBとDです。
SQLで文字列のマッチングを行う場合、"=" 演算子を使うと文字列が完全に一致した場合のみ真となります。
つまり、選択肢Aでは、val の値が A% であるものしか検索されません。
A で始まる、あるいは XYZ を含む、といった部分マッチが必要な場合は他の検索手段が必要になります。
標準SQLでは LIKE 演算子とワイルドカードを使った文字列マッチングができます。
Linuxなどでファイル検索をするときは、? と * がワイルドカードで、? は任意の1文字、* は任意の文字列とマッチすることをご存じの方も多いでしょう。
SQL では _ と % がワイルドカードで、LIKE と組み合わせて使ったとき、_ は任意の1文字、% は任意の文字列(0文字以上)とマッチします。
選択肢Bは val が A の後に任意の文字列が続いているものとマッチしますから、これが正解の一つです。
Unix/Linuxには、正規表現という、ワイルドカードよりも強力な文字列マッチの手法があり、PostgreSQLをはじめとする多くのRDBMSでもこの正規表現を使うことができます。ただし、正規表現の実装方法はRDBMSの種類によってまちまちなので、注意が必要です。
PostgreSQLで正規表現を使うには ~ と SIMILAR TO の2通りの方法があります。
"~"演算子は、文字列内に指定の正規表現が含まれる場合に真となります。
選択肢Cは、val 列が A を含む場合すべてにマッチします、つまり先頭以外に Aが含まれる場合もマッチしてしまいます。
選択肢Dで使われている"^"は文字列の先頭を表す正規表現です。従って、選択肢Dは先頭が A である任意の文字列とマッチするので、正解となります。
SIMILAR TO は、文字列が指定の正規表現と完全にマッチする場合に真となります。つまり、使い方としては LIKE とほぼ同じで、文字列として正規表現(の一部)が使える、ということです。ただし、Unix/Linuxの正規表現では"."が任意の一文字、".*"が任意の文字列を表すのに対し、SIMILAR TO では LIKE と同様に、"_"が任意の一文字、"%"が任意の文字列を表す、先頭と末尾を表す"^"と"$"がない(そもそも必要ない)など、正規表現と少し違う点もあります。
この例題の選択肢にはありませんが、LIKE や正規表現を使う他に、文字列関数を使う方法もあります。
substring()関数を使うと、文字列のn文字目からm文字を取り出す、といったことができます。例えば substring('ABCDE', 3, 2) は、文字列'ABCDE' の3文字目から2文字、つまり'CD'になります。
従って、
SELECT * FROM foo WHERE substring(val, 1, 1) = 'A';
とすれば、val 列の1文字目から1文字、つまり先頭の一文字が A である行を検索することができます。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
採用になった方にはLPI-Japanオリジナルの記念品を贈呈します。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.