このトピックでは、ArcGIS での一般的な選択クエリの要素について説明します。ArcGIS のクエリ式は、SQL を使用します。
注意:
SQL 構文は、[フィールド演算] ウィンドウを使ったフィールドの演算には機能しません。
一般的なクエリ: 文字列の検索
クエリ内の文字列は、次の例のように、必ず単一引用符で囲む必要があります:
STATE_NAME = 'California'
Microsoft SQL Server 内のジオデータベースに対して実行する場合を除き、式内の文字列の大文字と小文字は区別されます。他のデータ ソースで大文字と小文字を区別せずに検索するには、SQL 関数を使用して、すべての値を大文字または小文字に変換する方法があります。ファイル ジオデータベースやシェープ ファイルなどのファイル ベースのデータ ソースの場合、UPPER 関数または LOWER 関数を使用して選択する大文字または小文字を設定できます。たとえば、次の式は、名前が「Rhode Island」または「RHODE ISLAND」として格納されている州を選択します。
UPPER(STATE_NAME) = 'RHODE ISLAND'
文字列に単一引用符が含まれている場合は、次の例のように、エスケープ文字として単一引用符を前に追加する必要があります。
NAME = 'Alfie''s Trough'
部分文字列検索を行うには、= 演算子の代わりに LIKE 演算子を使用します。たとえば、次の条件式は、アメリカの州の中から Mississippi と Missouri を選択します。
STATE_NAME LIKE 'Miss%'
パーセント記号 (%) は、その位置で、1 文字、100 文字、または 0 文字など、任意数の文字が許可されることを意味します。1 文字を表すワイルドカードを検索に使用したい場合は、アンダースコア (_) を使用します。たとえば、次の条件式は Catherine Smith と Katherine Smith を検索します。
OWNER_NAME LIKE '_atherine Smith'
文字列値をソート順序に基づいて選択する場合は、大なり (>)、小なり (<)、以上 (>=)、以下 (<=)、不等号 (<>)、BETWEEN の各演算子を使用することができます。たとえば、次の条件式では、M から Z までの文字で始まる名前を持つカバレッジ内のすべての都市を選択します。
CITY_NAME >= 'M'
文字列関数は、文字列の書式設定に使用することができます。たとえば、LEFT 関数は、文字列の左側から指定された文字数の位置にある文字を返します。次のクエリは、文字「A」で始まるすべての州を返します。
LEFT(STATE_NAME,1) = 'A'
サポートされる関数のリストについては、データベース管理システム (DBMS) のマニュアルをご参照ください。
一般的な条件式: NULL 値の検索
NULL キーワードを使用して、指定したフィールドに NULL 値が設定されたフィーチャおよびレコードを選択することができます。NULL キーワードの前には、必ず「IS」または「IS NOT」が付きます。たとえば、1996 年の人口が未入力になっている都市を見つけるには、次のようなクエリを使用することができます。
POPULATION IS NULL
または、1996 年の人口が入力されている都市を見つけるには、次のようなクエリを使用することができます。
POPULATION96 IS NOT NULL
一般的な条件式: 数値の検索
ピリオド (.) は、ロケールや地域のオプションの設定にかかわらず、常に小数点として使用されます。条件式では、小数点または千単位の区切り文字としてカンマ (,) を使用することはできません。
数値の検索には、次の例に示すように、等号 (=)、不等号 (<>)、より大きい (>)、より小さい (<)、以上 (>=)、以下 (<=)、BETWEEN の各演算子を使用することができます。
POPULATION >= 5000
数値関数は、数値の書式設定に使用することができます。たとえば、ROUND 関数は、ファイル ジオデータベース内の数値を特定の桁数に丸めます。
ROUND(SQKM,0) = 500
サポートされる数値関数のリストについては、DBMS のマニュアルをご参照ください。
日時
一般的なルールとよく使用される式
ジオデータベースのデータ ソースは、日付を Date フィールドに格納します。ただし、シェープファイルは日付を Date フィールドに格納しません。したがって、以下に示すクエリ構文のほとんどに、時間への参照が含まれます。フィールドに日付だけが含まれていることがわかっていて、クエリの時間部分を省略しても安全な場合もあれば、時間を含めないとクエリから構文エラーが返される場合もあります。
日付フィールドを検索する場合、データソースで必要とされる構文に注意する必要があります。[検索条件設定] の [項目] モードで日付クエリを作成した場合は、正しい構文が自動的に生成されます。次のクエリの例では、ファイル ジオデータベース データ ソースの 2011 年 1 月 1 日以降のすべてのレコードが返されます。
INCIDENT_DATE >= date '2011-01-01 00:00:00'
メモ:
日付は、1899 年 12 月 30 日 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 または地域の設定に応じた相当の形式で表示されます。
エンタープライズ ジオデータベースの日時構文
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';
ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソース
Datefield = date 'yyyy-mm-dd'
ファイル ジオデータベースは日付フィールドで時間の使用をサポートするため、それを条件式に追加することができます。
Datefield = date 'yyyy-mm-dd hh:mm:ss'
シェープファイルとカバレッジでは、日付フィールドの時間の使用はサポートされません。
メモ:
ファイル ジオデータベースによって使用されるすべての SQL は、SQL-92 標準に基づいています。
既知の制限
結合の左側の部分 (最初のテーブル) での日付検索は、ジオデータベース、シェープファイル、DBF テーブルなどのファイルベースのデータ ソースでのみサポートされています。ただし、下で説明するように、エンタープライズ データなどのファイルベースではないデータを操作する場合は、回避方法がある可能性があります。
結合の左側の部分での日付検索は、ファイルベースのデータ ソースのために開発された制限付きバージョンの 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'」の条件を満たすレコードがすべて選択されます。
条件式の結合
AND および OR 演算子を使用して式を結合することで、複合条件式を作成できます。たとえば、次の条件式は、敷地面積が 1500 平方メートルより広く、車 3 台分より大きい車庫を持つすべての家を選択します。
AREA > 1500 AND GARAGE > 3
OR 演算子を使用する場合は、次の例のように、OR 演算子で区切られた 2 つの式のうち少なくとも 1 つの式が、選択対象レコードに対して真である必要があります。
RAINFALL < 20 OR SLOPE > 35
式の先頭で NOT 演算子を使用すると、指定された式と一致しないフィーチャまたはレコードが検索されます。たとえば、次のように指定します。
NOT STATE_NAME = 'Colorado'
NOT 式を結合するには、AND および OR を使用します。たとえば、次の条件式は、金沢市を除くすべての石川県の市区町村を選択します。
SUB_REGION = 'New England' AND NOT STATE_NAME = 'Maine'
演算
条件式には、算術演算子 (+、-、*、および /) を使用した演算を含めることができます。演算は、次の例のように、フィールドと数値の間で行うことができます。
AREA >= PERIMETER * 100
演算は、フィールド間で行うこともできます。たとえば、人口密度が 1 平方キロメートルあたり 25 人以下の郡を探すには、次の条件式を使用します。
POP1990 / AREA <= 25
演算子の優先順位
条件式は、標準演算子の優先順位ルールに従って評価されます。たとえば、括弧で囲まれた部分の式は、括弧の外側の部分よりも先に評価されます。
HOUSEHOLDS > MALES * (POP90_SQMI + AREA)
[SQL 編集] モードでは、括弧を入力することで追加できます。または、[項目] モードでは、[グループ] コマンドおよび [グループ解除] コマンドを使用して括弧を追加または削除することができます。
サブクエリ
サブクエリは、別のクエリにネストされたクエリであり、ジオデータベース データ ソースでのみサポートされます。サブクエリは、述語または集約関数を適用したり、別のテーブルに保存された値とデータを比較したりするために使用できます。これには、IN キーワードと ANY キーワードを使用します。たとえば、次のクエリは、indep_countries テーブルに含まれていない国だけを選択します。
COUNTRY_NAME NOT IN (SELECT COUNTRY_NAME FROM indep_countries)
メモ:
カバレッジ、シェープファイル、その他のジオデータベース以外のファイルベースのデータ ソースは、サブクエリをサポートしません。バージョン対応のエンタープライズ フィーチャクラスおよびテーブルで実行されるサブクエリは、差分テーブルに格納されたフィーチャを返しません。ファイル ジオデータベースは、このセクションで説明するサブクエリを制限付きでサポートしますが、エンタープライズ ジオデータベースは完全にサポートします。エンタープライズ ジオデータベースのサブクエリの機能の詳細については、使用している DBMS のマニュアルをご参照ください。
次のクエリは、countries テーブルに含まれるどのフィーチャの GDP2005 よりも大きい GDP2006 を持つフィーチャを返します。
GDP2006 > (SELECT MAX(GDP2005) FROM countries)
ファイル ジオデータベースでのサブクエリのサポートは、以下に制限されています。
- 比較演算子を持つスカラー サブクエリ。スカラー サブクエリは、単一の値を返します。次に例を示します。
GDP2006 > (SELECT MAX(GDP2005) FROM countries)
ファイル ジオデータベースの場合、集合関数 AVG、COUNT、MIN、MAX、SUM は、スカラー サブクエリでのみ使用することができます。 - EXISTS 述語。次に例を示します。
EXISTS (SELECT * FROM indep_countries WHERE COUNTRY_NAME = 'Mexico')
演算子
次に、ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソースによってサポートされるクエリ演算子を示します。これらの演算子はエンタープライズ ジオデータベースでもサポートされますが、データ ソースでは別の構文が必要になる場合があります。これらの演算子に加えて、エンタープライズ ジオデータベースでは、その他の機能もサポートされています。詳細については、DBMS のマニュアルをご参照ください。
算術演算子
算術演算子を使用して、数値の加算、減算、乗算、除算を実行します。
演算子 | 説明 |
---|---|
* | 乗算のための算術演算子 |
/ | 除算のための算術演算子 |
+ | 加算のための算術演算子 |
- | 減算のための算術演算子 |
比較演算子
比較演算子を使用して、2 つの式を比較します。
演算子 | 説明 |
---|---|
< | 「未満」を意味します。文字列 (比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
<= | 「以下」を意味します。文字列 (比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
<> | 「等しくない」を意味します。文字列 (比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
> | 「より大きい」を意味します。文字列 (比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
>= | 「以上」を意味します。文字列 (比較はアルファベット順に基づきます)、数値、日付に対して使用できます。 |
[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 は、ファイルおよびエンタープライズ ジオデータベースでのみサポートされます。 |
[NOT] IN | フィールドに複数の文字列または値の 1 つが含まれているレコードを選択します。先頭に NOT が付く場合は、フィールドに複数の文字列または値の 1 つが含まれていないレコードを選択します。たとえば、次の式は 4 つの異なる州名を検索します。 STATE_NAME IN ('Alabama', 'Alaska', 'California', 'Florida') |
IS [NOT] NULL | 指定されたフィールドに NULL 値が含まれているレコードを選択します。NULL の前に NOT が付く場合は、指定されたフィールドに任意の値を持つレコードを選択します。 |
x [NOT] LIKE y [ESCAPE 'escape-character'] | 部分文字列検索を行うには、= 演算子の代わりに、LIKE 演算子とワイルドカードを使用します。パーセント記号 (%) は、その位置で、1 文字、100 文字、または 0 文字など、任意数の文字が許可されることを意味します。1 文字を表すワイルドカードを検索に使用したい場合は、アンダースコア (_) を使用します。文字以外のデータにアクセスする必要がある場合は、CAST 関数を使用します。たとえば、次のクエリは、整数フィールド SCORE_INT から 8 で始まる値を返します。 CAST (SCORE_INT AS VARCHAR(10)) LIKE '8%' 検索文字列にパーセント記号またはアンダースコアを含めるには、エスケープ キーワードを使用して、別の文字を「エスケープ」文字として指定します。エスケープ文字のすぐ後にあるパーセント記号またはアンダースコアは、そのままの文字として扱われます。たとえば、次の式は、10% DISCOUNT や A10% のように 10% を含む文字列を返します。 AMOUNT LIKE '%10$%%' ESCAPE '$' |
論理演算子
演算子 | 説明 |
---|---|
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 |
関数
次に、ファイル ジオデータベース、シェープファイル、カバレッジ、その他のファイルベースのデータ ソースによってサポートされる関数を示します。これらの関数はエンタープライズ ジオデータベースでもサポートされますが、データ ソースでは別の構文または関数名が必要になる場合があります。これらの関数に加えて、エンタープライズ ジオデータベースでは、その他の機能もサポートされています。詳細については、DBMS のマニュアルをご参照ください。
日付関数
関数 | 説明 |
---|---|
CURRENT_DATE | 現在の日付を返します。 |
EXTRACT(extract_field FROM extract_source) | extract_field の extract_source 部分を返します。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) | string_exp で指定した文字位置から start で指定した文字数の文字列を length から取得して返します。 |
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 の余弦を返します。float_exp |
FLOOR(numeric_exp) | numeric_exp 以下の最も大きい整数を返します。 |
LOG(float_exp) | float_exp の自然対数を返します。 |
LOG10(float_exp) | float_exp の底が 10 の対数を返します。 |
MOD(integer_exp1, integer_exp2) | integer_exp1 で除算された integer_exp2 の余りを返します。 |
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 の正弦を返します。float_exp |
TAN(float_exp) | 角度をラジアンで示した 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 [(length)])
例:
CAST (SCORE_INT AS VARCHAR(10))
引数 exp には、列の名前、別のスカラー関数の結果、またはリテラルを指定できます。Data_type には、キーワード CHAR、VARCHAR、INTEGER、SMALLINT、REAL、DOUBLE、DATE、TIME、DATETIME、NUMERIC、DECIMAL のいずれかを指定できます。キーワードは大文字でも小文字でもかまいません。
CAST 関数の詳細については、「CAST と CONVERT」をご参照ください。