ArcGIS で使用される条件式の SQL リファレンス

このトピックでは、ArcGIS の選択式で使用される、一般的なクエリの要素について説明します。ArcGIS の条件式は、一般的な SQL 構文を使用します。

注意注意:

SQL 構文は、[フィールド演算] を使ったフィールドの演算には機能しません。

フィールド

SQL 式でフィールドを指定する場合は、SQL の予約キーワードと同じ名前であるなど、フィールド名があいまいになるときは区切り文字を使用します。

予約されたキーワードの数は多く、今後のリリースで新しいキーワードが追加される可能性があるため、フィールド名は常に区切り文字で囲みます。

フィールド名の区切り文字は、DBMS ごとに異なります。ファイル ジオデータベースなどのファイルベースのデータ、ArcSDE ジオデータベース データ、あるいは ArcIMS フィーチャクラスまたはイメージ サービス サブレイヤのデータを検索する場合は、フィールド名を二重引用符(")で囲むことができます。

"AREA"

パーソナル ジオデータベースを検索する場合は、次のようにフィールドを角括弧で囲んでください。

[AREA]

パーソナル ジオデータベースのラスタ データセットの場合は、フィールド名を二重引用符(")で囲みます。

"AREA"

ファイル ジオデータベースの場合、フィールド名を二重引用符で囲むことができますが、通常、その必要はありません。

AREA

文字列

検索文字列は、次のように常に単一引用符(')で囲む必要があります。次に例を示します。

STATE_NAME = 'California'

部分文字列検索を実行するために使用するワイルドカードも、検索対象のデータ ソースに応じて異なります。たとえば、次の条件式はファイルベースまたは 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'」として保存されます。

注意注意:

日付は、1899 年 12 月 30 日の 00:00:00 を基準としてデータベースに保存されます。これは、ここで示すデータ ソースすべてに当てはまります。

このセクションの説明は、時間値に対する検索ではなく、日付に対する検索のみを対象としています。日時フィールドに日付だけを渡すと、日時フィールドの時間に 0 が設定されます。このため、日付とともに NULL 以外の時間が保存されていると(例: 1999 年 1 月 12 日 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 または 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)

サブクエリでは、テーブル内のレコードごとに、そのターゲット テーブルのすべてのデータの解析が必要になる場合があります。これを大きなデータセットで実行すると、処理速度が大幅に低下することがあります。

ファイル ジオデータベースでのサブクエリのサポートは、以下に制限されています。

演算子

次に、ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソースによってサポートされるクエリ演算子を示します。これらの演算子はパーソナル ジオデータベースと 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 演算子とワイルドカードを使用します。たとえば、次の条件式は、都道府県名から山口県、山形県、山梨県を選択します。

"STATE_NAME" LIKE 'Miss%'
パーセント記号(%)は、その位置にあるすべてとマッチすることを意味します(1 文字、100 文字、0 文字など)。1 文字を表すワイルドカードを検索に使用したい場合は、アンダースコア(_)を使用します。たとえば、次の条件式は、富山県と岡山県を検索します。
"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 つの条件を満たすレコードを選択します。たとえば、次の条件式は、敷地面積が 200 平方メートル以上あるか、車 2 台分以上の車庫を持つすべての家を選択します。

"AREA" > 1500 OR "GARAGE" > 2

NOT

条件に一致しないレコードを選択します。たとえば、次の条件式は、カリフォルニア以外のすべての州を選択します。

NOT "STATE_NAME" = 'California'

論理演算子

文字列演算子

演算子

説明

||

複数の文字列条件式を連結した文字列を返します。

FIRST_NAME || MIDDLE_NAME || LAST_NAME

文字列演算子

関数

次に、ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソースによってサポートされる関数を示します。これらの関数はパーソナル ジオデータベースと ArcSDE ジオデータベースでもサポートされますが、データ ソースでは別の構文または関数名が必要になる場合があります。これらの関数に加えて、パーソナルおよび ArcSDE ジオデータベースでは追加機能もサポートされています。詳細については、DBMS のマニュアルをご参照ください。

日付関数

関数

説明

CURRENT_DATE

現在の日付を返します。

EXTRACT(extract_fieldFROM 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)

文字列の長さ(文字数)を返します。

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_expfloat_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_expinteger_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」をご参照ください。

関連トピック

5/10/2014