ArcGIS で使用される条件式の SQL リファレンス
このトピックでは、ArcGIS の選択式で使用される、一般的なクエリの要素について説明します。ArcGIS の条件式は、一般的な SQL 構文を使用します。
SQL 構文は、[フィールド演算] を使ったフィールドの演算には機能しません。
フィールド
SQL 式でフィールドを指定する場合は、SQL の予約キーワードと同じ名前であるなど、フィールド名があいまいになるときは区切り文字を使用します。
予約されたキーワードの数は多く、今後のリリースで新しいキーワードが追加される可能性があるため、フィールド名は常に区切り文字で囲みます。
フィールド名の区切り文字は、DBMS ごとに異なります。ファイル ジオデータベースなどのファイルベースのデータ、ArcSDE ジオデータベース データ、あるいは ArcIMS フィーチャクラスまたはイメージ サービス サブレイヤのデータを検索する場合は、フィールド名を二重引用符(")で囲むことができます。
"AREA"
パーソナル ジオデータベースを検索する場合は、次のようにフィールドを角括弧で囲んでください。
[AREA]
パーソナル ジオデータベースのラスタ データセットの場合は、フィールド名を二重引用符(")で囲みます。
"AREA"
文字列
検索文字列は、次のように常に単一引用符(')で囲む必要があります。次に例を示します。
STATE_NAME = 'California'
- 式の文字列の大文字と小文字は区別されます。フィーチャクラスとテーブルでは、UPPER 関数または LOWER 関数を使用して、選択に使用する大文字と小文字を設定することができます。次に例を示します。
UPPER("STATE_NAME") = 'RHODE ISLAND'
- パーソナル ジオデータベースのフィーチャクラスとテーブルでは、文字列の大文字と小文字は区別されません。必要に応じて、UPPER または LOWER に相当する UCASE 関数と LCASE 関数を使用することができます。
- 文字列に単一引用符が含まれている場合は、エスケープ文字としての単一引用符を前に追加する必要があります。次に例を示します。
"NAME" = 'Alfie''s Trough'
部分文字列検索を実行するために使用するワイルドカードも、検索対象のデータ ソースに応じて異なります。たとえば、次の条件式はファイルベースまたは ArcSDE ジオデータベース データ ソースのアメリカの州名から Mississippi と Missouri を選択します。
"STATE_NAME" LIKE 'Miss%'
パーセント記号(%)は、その位置で、1 文字、100 文字、または 0 文字など、任意数の文字が許可されることを意味します。パーソナル ジオデータベースを検索するために使用するワイルドカードは、任意数の文字に対するアスタリスク(*)と、1 文字に対する疑問符(?)です。
文字列関数は、文字列の書式設定に使用することができます。たとえば、LEFT 関数は、文字列の左側から指定された文字数の位置にある文字を返します。次のクエリは、文字「A」で始まるすべての州を返します。
LEFT("STATE_NAME",1) = 'A'
サポートされる関数のリストについては、DBMS のマニュアルをご参照ください。
数値
ピリオド(.)は、ロケールや地域のオプションの設定にかかわらず、常に小数点として使用されます。条件式では、小数点または千単位の区切り文字としてカンマ(,)を使用することはできません。
数値の検索には、等号(=)、不等号(<>)、より大きい(>)、より小さい(<)、以上(>=)、以下(<=)、BETWEEN の各演算子を使用することができます。次に例を示します。
"POPULATION" >= 5000
数値関数は、数値の書式設定に使用することができます。たとえば、ROUND 関数は、ファイル ジオデータベース内の数値を特定の桁数に丸めます。
ROUND("SQKM",0) = 500
サポートされる数値関数のリストについては、DBMS のマニュアルをご参照ください。
日時
一般規則
ジオデータベースのデータ ソースは、日付を Date フィールドに格納します。ただし、ArcInfo カバレッジとシェープファイルは例外です。
したがって、以下に示すクエリ構文のほとんどに、時間への参照が含まれます。フィールドに日付だけが含まれていることがわかっていて、クエリの時間部分を省略しても安全な場合もあれば、時間を含めないとクエリから構文エラーが返される場合もあります。
ArcMap の日付形式の主な目的は、時間ではなく日付を格納することです。データベースで実際に日時フィールドが使用されている場合は、フィールドに時間だけを格納することも可能ですが、これは推奨されません。時間に対する検索は少し複雑です。たとえば、「12:30:05 PM」は「'1899-12-30 12:30:05'」として保存されます。
日付は、December 30th 1899 の 00:00:00 を基準としてデータベースに保存されます。これは、ここで示すデータ ソースすべてに当てはまります。
このセクションの説明は、時間値に対する検索ではなく、日付に対する検索のみを対象としています。日時フィールドに日付だけを渡すと、日時フィールドの時間に 0 が設定されます。このため、日付とともに NULL 以外の時間が保存されていると(例: January 12, 1999, 04:00:00)、時間が 12:00:00 AM であるレコードのみが取得されるため、日付に対する検索でもレコードは返されません。
属性テーブルでは、データベースの形式ではなく、地域の設定に基づいたわかりやすい形式で日時が表示されます。ほとんどの場合はこれで問題ありませんが、欠点がいくつかあります。
- SQL クエリで示す文字列は、特に時間が含まれる場合に、属性テーブルで表示される文字列値に少し似ている場合があります。たとえば、地域の設定が米国である場合、時間を「00:00:15」と入力すると、属性テーブルには「12:00:15 AM」と表示されますが、対応するクエリ構文は「Datefield= '1899-12-30 00:00:15'」になります。
- 属性テーブルは、編集内容を保存するまでデータ ソースを認識しません。属性テーブルは、まず独自の書式に合わせて入力された値の書式設定を試み、次に編集内容の保存時に、データベースに合わせて結果値の調整を試みます。このため、シェープファイルへの時間の入力は可能ですが、編集内容の保存時に時間が除外される場合があります。この場合、フィールドには値「'1899-12-30'」が含まれます。この値は、12:00:00 AM または地域の設定に応じた相当の形式で表示されます。
ArcSDE ジオデータベースの日時構文
Informix
Datefield = 'yyyy-mm-dd hh:mm:ss'
クエリの「hh:mm:ss」の部分は、00:00:00 であっても省略できません。
Oracle
Datefield = date 'yyyy-mm-dd'
この場合、時間が NULL でないレコードは返されません。
Oracle で日付を検索する場合には、次の代替書式を使用することができます。
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')
2 番目のパラメータ「'YYYY-MM-DD HH24:MI:SS'」では、検索で使用する書式を記述します。実際のクエリは、次のようになります。
Datefield = TO_DATE('2003-01-08 14:35:00','YYYY-MM-DD HH24:MI:SS')
次のような短いバージョンを使用することもできます。
TO_DATE('2003-11-18','YYYY-MM-DD')
この場合も、時間が NULL でないレコードは返されません。
SQL Server
Datefield = 'yyyy-mm-dd hh:mm:ss'
クエリの「hh:mm:ss」の部分は、レコード内で時間が設定されていない場合に省略できます。
代替書式は次のとおりです。
Datefield = 'mm/dd/yyyy'
IBM DB2
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')
クエリの「hh:mm:ss」の部分は、00:00:00 であっても省略できません。
PostgreSQL
Datefield = TIMESTAMP 'YYYY-MM-DD HH24:MI:SS' Datefield = TIMESTAMP 'YYYY-MM-DD'
「equal to」クエリを使用するときは、完全なタイム スタンプを指定する必要があります。指定しないと、レコードは返りません。次のようなステートメントでのクエリは、クエリ対象のテーブルに正確に「2007-05-29 00:00:00 or 2007-05-29 12:14:25」というタイム スタンプの日付レコードが含まれる場合に成功します。
select * from table where date = '2007-05-29 00:00:00';
または
select * from table where date = '2007-05-29 12:14:25';
greater than、less than、greater than or equal to、less than or equal to などの他の演算子を使用する場合は、時間を指定しなくてもかまいません。もちろん、時間の精度が必要な場合は指定できます。次のどちらのステートメントも動作します。
select * from table where date < '2007-05-29';
select * from table where date < '2007-05-29 12:14:25';
ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソース
ファイル ジオデータベース、シェープファイル、カバレッジ内の日付には、先頭に date が付きます。
"Datefield" = date 'yyyy-mm-dd'
ファイル ジオデータベースは日付フィールドで時間の使用をサポートするため、それを条件式に追加することができます。
"Datefield" = date 'yyyy-mm-dd hh:mm:ss'
シェープファイルとカバレッジでは、日付フィールドの時間の使用はサポートされません。
ファイル ジオデータベースによって使用されるすべての SQL は、SQL-92 標準に基づいています。
パーソナル ジオデータベース
パーソナル ジオデータベースでは、シャープ記号(#)を使用して日付を区切ります。
次に例を示します。
[Datefield] = #mm-dd-yyyy hh:mm:ss#
これは「[Datefield] = #mm-dd-yyyy#」に短縮することができます。
代替書式は次のとおりです。
[Datefield] = #yyyy/mm/dd#
既知の制限
結合の左側の部分(最初のテーブル)での日付検索は、ジオデータベース、シェープファイル、DBF テーブルなどのファイルベースのデータ ソースでのみサポートされています。ただし、以下で説明するように、パーソナル ジオデータベースのデータや ArcSDE データなどのファイルベースではないデータを操作するための解決策があります。
結合の左側の部分での日付検索は、ファイルベースのデータ ソースのために開発された制限付きバージョンの SQL を使用するとうまくいきます。そのようなデータ ソースを使用していない場合は、条件式で次の書式を強制的に使用することができます。そのためには、クエリ条件式に複数の結合テーブル内のフィールドを使用します。たとえば、フィーチャクラスとテーブル(FC1 と Table1)を結合し、どちらもパーソナル ジオデータベースに格納されている場合、次の式は失敗するか、データを返しません。
FC1.date = date #01/12/2001# FC1.date = date '01/12/2001'
検索を成功させるには、次のようなクエリを作成します。
FC1.date = date '01/12/2001' and Table1.OBJECTID > 0
このクエリには両方のテーブルのフィールドが使用されているため、制限付きバージョンの SQL が使用されます。この式では、結合の作成中に一致したレコードについて「Table1.OBJECTID」は常に「> 0」であるため、結合一致を含むすべての行がこの式の条件に一致します。
「FC1.date = date '01/12/2001'」を満たすレコードがすべて選択されていることを確認するには、次のクエリを使用します。
FC1.date = date '01/12/2001' and (Table1.OBJECTID IS NOT NULL OR Table1.OBJECTID IS NULL)
このクエリによって、各レコードに結合一致があるかどうかにかかわらず、「FC1.date = date '01/12/2001'」の条件を満たすレコードがすべて選択されます。
サブクエリ
カバレッジ、シェープファイル、その他のジオデータベース以外のファイルベースのデータ ソースは、サブクエリをサポートしません。バージョン対応の ArcSDE フィーチャクラスおよびテーブルで実行されるサブクエリは、差分テーブルに格納されたフィーチャを返しません。ファイル ジオデータベースは、このセクションで説明するサブクエリを制限付きでサポートしますが、パーソナル ジオデータベースと ArcSDE ジオデータベースは完全にサポートします。パーソナルおよび ArcSDE ジオデータベースのサブクラスの機能の詳細については、DBMS のマニュアルをご参照ください。
サブクエリとは、別のクエリにネストされたクエリのことです。サブクエリは、述語または集約関数を適用したり、別のテーブルに保存された値とデータを比較したりするために使用できます。これには、IN キーワードと ANY キーワードを使用します。たとえば、次のクエリは、indep_countries テーブルに含まれていない国だけを選択します。
"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)
次のクエリは、countries テーブルに含まれるどのフィーチャの GDP2005 よりも大きい GDP2006 を持つフィーチャを返します。
"GDP2006" > (SELECT MAX("GDP2005") FROM countries)
サブクエリでは、テーブル内のレコードごとに、そのターゲット テーブルのすべてのデータの解析が必要になる場合があります。これを大きなデータセットで実行すると、処理速度が大幅に低下することがあります。
ファイル ジオデータベースでのサブクエリのサポートは、以下に制限されています。
- IN 述語。次に例を示します。
"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)
- 比較演算子を持つスカラー サブクエリ。スカラー サブクエリは単一の値を返します。次に例を示します。
"GDP2006" > (SELECT MAX("GDP2005") FROM countries)
ファイル ジオデータベースの場合、集合関数 AVG、COUNT、MIN、MAX、SUM は、スカラー サブクエリでのみ使用することができます。 - EXISTS 述語。次に例を示します。
EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')
演算子
次に、ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソースによってサポートされるクエリ演算子を示します。これらの演算子はパーソナル ジオデータベースと ArcSDE ジオデータベースでもサポートされますが、データ ソースでは別の構文が必要になる場合があります。これらの演算子に加えて、パーソナルおよび ArcSDE ジオデータベースでは追加機能もサポートされています。詳細については、DBMS のマニュアルをご参照ください。
算術演算子
算術演算子を使用して、数値の加算、減算、乗算、除算を実行します。
演算子 |
説明 |
---|---|
* |
乗算のための算術演算子 |
/ |
除算のための算術演算子 |
+ |
加算のための算術演算子 |
- |
減算のための算術演算子 |
比較演算子
比較演算子を使用して、2 つの式を比較します。
演算子 |
説明 |
---|---|
< |
「未満」を意味します。文字列(比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
<= |
「以下」を意味します。文字列(比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
<> |
「等しくない」を意味します。文字列(比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
> |
「より大きい」を意味します。文字列(比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
>= |
「以上」を意味します。文字列(比較はアルファベット順に基づきます)、数値、日付に対して使用できます。たとえば、次のクエリでは、M から Z までの文字で始まる名前を持つ、すべての都市を選択します。 "CITY_NAME" >= 'M' |
[NOT] BETWEEN x AND y |
x 以上で y 以下の値を持つレコードを選択します。先頭に NOT が付く場合は、指定された範囲外の値を持つレコードを選択します。たとえば、次の条件式は、1 以上 10 以下の値を持つレコードをすべて選択します。 "OBJECTID" BETWEEN 1 AND 10これは次の条件式に相当します。 "OBJECTID" >= 1 AND OBJECTID <= 10ただし、インデックス付きフィールドを検索する場合は、条件式に BETWEEN を使用すると、パフォーマンスが向上します。 |
[NOT] EXISTS |
サブクエリがレコードを少なくとも 1 つ返す場合は TRUE、そうでない場合は FALSE を返します。たとえば、次の条件式は、OBJECTID フィールドに 50 の値が含まれている場合に TRUE を返します。 EXISTS (SELECT * FROM parcels WHERE "OBJECTID" = 50)EXISTS は、ファイル、パーソナル、および ArcSDE ジオデータベースでのみサポートされます。 |
[NOT] IN |
フィールドに複数の文字列または値の 1 つが含まれているレコードを選択します。先頭に NOT が付く場合は、フィールドに複数の文字列または値の 1 つが含まれていないレコードを選択します。たとえば、次の式は 4 つの異なる州名を検索します。 "STATE_NAME" IN ('Alabama', 'Alaska', 'California', 'Florida')ファイル、パーソナル、および ArcSDE ジオデータベースでは、この演算子はサブクエリにも適用できます。 "STATE_NAME" IN (SELECT "STATE_NAME" FROM states WHERE "POP" > 5000000) |
IS [NOT] NULL |
指定されたフィールドに NULL 値が含まれているレコードを選択します。NULL の前に NOT が付く場合は、指定されたフィールドに任意の値を持つレコードを選択します。たとえば、次の条件式は、人口が NULL 値のレコードをすべて選択します。 "POPULATION" IS NULL |
x [NOT] LIKE y [ESCAPE 'escape-character'] |
部分文字列検索を行うには、= 演算子の代わりに、LIKE 演算子とワイルドカードを使用します。たとえば、次の条件式は、米国の州名から Mississippi、Missouri を選択します。 "STATE_NAME" LIKE 'Miss%'パーセント記号(%)は、その位置にあるすべてとマッチすることを意味します(1 文字、100 文字、0 文字など)。1 文字を表すワイルドカードを検索に使用したい場合は、アンダースコア(_)を使用します。たとえば、次の条件式は、「Catherine Smith」と「Katherine Smith」を検索します。 "OWNER_NAME" LIKE '_atherine Smith'パーセント記号とアンダースコアのワイルドカードは、すべてのファイルベースのデータまたはマルチユーザ ジオデータベース データに対応します。LIKE は、式の両辺の文字データに作用します。文字以外のデータにアクセスする必要がある場合は、CAST 関数を使用します。たとえば、次のクエリは、整数フィールド SCORE_INT から 8 で始まる値を返します。 CAST ("SCORE_INT" AS VARCHAR) LIKE '8%'検索文字列にパーセント記号またはアンダースコアを含めるには、エスケープ キーワードを使用して、別の文字を「エスケープ」文字として指定します。エスケープ文字のすぐ後にあるパーセント記号またはアンダースコアは、そのままの文字として扱われます。たとえば、次の式は、10% DISCOUNT や A10% のように 10% を含む文字列を返します。 "AMOUNT" LIKE '%10$%%' ESCAPE '$'パーソナル ジオデータベースを検索するために使用するワイルドカードは、任意数の文字に対するアスタリスク(*)と、1 文字に対する疑問符(?)です。また、1 桁の数値に一致するワイルドカードとしてシャープ記号(#)が使用されます。たとえば、次のクエリは、パーソナル ジオデータベースから土地区画番号 A1、A2 などを返します。 [PARCEL_NUMBER] LIKE 'A#' |
論理演算子
演算子 |
説明 |
---|---|
AND |
2 つの条件を結合し、両方の条件を満たすレコードを選択します。たとえば、次の条件式は、敷地面積が 200 平方メートル以上で車 2 台分以上の車庫を持つすべての家を選択します。 "AREA" > 1500 AND "GARAGE" > 2 |
OR |
2 つの条件を結合し、少なくとも 1 つの条件を満たすレコードを選択します。たとえば、次の条件式は、敷地面積が 1500 平方メートルより広いか、車 2 台分より大きい車庫を持つすべての家を選択します。 "AREA" > 1500 OR "GARAGE" > 2 |
NOT |
条件に一致しないレコードを選択します。たとえば、次の条件式は、カリフォルニア以外のすべての州を選択します。 NOT "STATE_NAME" = 'California' |
関数
次に、ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソースによってサポートされる関数を示します。これらの関数はパーソナル ジオデータベースと ArcSDE ジオデータベースでもサポートされますが、データ ソースでは別の構文または関数名が必要になる場合があります。これらの関数に加えて、パーソナルおよび ArcSDE ジオデータベースでは追加機能もサポートされています。詳細については、DBMS のマニュアルをご参照ください。
日付関数
関数 |
説明 |
---|---|
CURRENT_DATE |
現在の日付を返します。 |
EXTRACT(extract_field FROM extract_source) |
extract_source から extract_field の部分を返します。extract_source 引数は、日時を表す式です。extract_field 引数には、YEAR、MONTH、DAY、HOUR、MINUTE、または SECOND のいずれかのキーワードを指定できます。 |
CURRENT TIME | 現在の時刻を返します。 |
文字列関数
引数 string_exp には、列の名前、文字列リテラル、またはデータ タイプを文字型として表すことができる別のスカラー関数の結果を指定することができます。
引数 character_exp は、可変長の文字列です。
引数 start または length には、数値リテラル、またはデータ タイプを数値型として表すことができる別のスカラー関数の結果を指定することができます。
文字列関数は 1 から始まります。つまり、文字列の最初の文字は 1 文字目となります。
関数 |
説明 |
---|---|
CHAR_LENGTH(string_exp) |
文字列の長さ(文字数)を返します。 |
CONCAT(string_exp1, string_exp2) |
string_exp2 を string_exp1 に連結した結果として得られる文字列を返します。 |
LOWER(string_exp) |
string_exp のすべての大文字を小文字に変換した文字列を返します。 |
POSITION(character_exp IN character_exp) |
第 2 文字式に含まれている第 1 文字式の位置を返します。この結果は、精度とスケールを持つ厳密な数値であり、精度は実装定義、スケールは 0 です。 |
SUBSTRING(string_exp FROM start FOR length) |
start で指定した文字位置から length で指定した文字数の文字列を string_exp から取得して返します。 |
TRIM(BOTH | LEADING | TRAILING trim_character FROM string_exp) |
string_exp の先頭、末尾、または両端から trim_character を削除した文字列を返します。 |
UPPER(string_exp) |
string_exp に一致する文字列を返します。すべての小文字が大文字に変換されます。 |
数値関数
すべての数値関数は数値を返します。
numeric_exp、float_exp、または integer_exp 引数には、データ タイプを数値型として表すことができる列の名前、別のスカラー関数の結果、または数値リテラルを指定することができます。
関数 |
説明 |
---|---|
ABS(numeric_exp) |
numeric_exp の絶対値を返します。 |
ACOS(float_exp) |
角度をラジアンで示した float_exp の逆余弦を返します。 |
ASIN(float_exp) |
角度をラジアンで示した float_exp の逆正弦を返します。 |
ATAN(float_exp) |
角度をラジアンで示した float_exp の逆正接を返します。 |
CEILING(numeric_exp) |
numeric_exp 以上の最も小さい整数を返します。 |
COS(float_exp) |
角度をラジアンで示した float_exp の余弦を返します。 |
FLOOR(numeric_exp) |
numeric_exp 以下の最も大きい整数を返します。 |
LOG(float_exp) |
float_exp の自然対数を返します。 |
LOG10(float_exp) |
float_exp の底が 10 の対数を返します。 |
MOD(integer_exp1, integer_exp2) |
integer_exp2 で除算された integer_exp1 の余りを返します。 |
POWER(numeric_exp, integer_exp) |
numeric_exp に integer_exp を累乗した値を返します。 |
ROUND(numeric_exp, integer_exp) |
numeric_exp を小数点以下の integer_exp で表される桁に丸めた値を返します。integer_exp が負の場合、numeric_exp は小数点以上の |integer_exp| で表される桁に丸められます。 |
SIGN(numeric_exp) |
numeric_exp の符号を表す値を返します。numeric_exp が 0 よりも小さい場合は -1 が返されます。numeric_exp が 0 の場合、0 が返されます。numeric_exp が 0 より大きい場合は 1 が返されます。 |
SIN(float_exp) |
ラジアンで角度を示した float_exp の正弦を返します。 |
TAN(float_exp) |
ラジアンで角度を示した float_exp の正接を返します。 |
TRUNCATE(numeric_exp, integer_exp) |
numeric_exp を小数点以下の integer_exp で表される桁に丸めた値を返します。integer_exp が負の場合、numeric_exp は小数点以上の |integer_exp| で表される桁に切り捨てられます。 |
CAST 関数
CAST 関数は、値を指定したデータ タイプに変換します。構文は次のとおりです。
CAST(exp AS data_type)
引数 exp には、列の名前、別のスカラ関数の結果、またはリテラルを指定できます。Data_type には、キーワード CHAR、VARCHAR、INTEGER、SMALLINT、REAL、DOUBLE、DATE、TIME、DATETIME、NUMERIC、DECIMAL のいずれかを指定できます。キーワードは大文字でも小文字でもかまいません。
CAST 関数の詳細については、「CAST と CONVERT」をご参照ください。