ArcGIS Online の標準化された SQL 関数

ArcGIS Online は、ホスト フィーチャ レイヤーを検索する際に、標準化された SQL クエリを使用するように開発者に要求します。 標準化された SQL クエリの使用は、SQL インジェクション攻撃を防ぐのに役立ちます。 すべての ArcGIS アプリケーションは、標準の SQL クエリをサポートします。

標準化されたクエリの制限

  • 標準化されたクエリは、組織サイト全体に適用されます。一部のレイヤーに対して無効に設定することはできません。
  • 標準化されたクエリは、異なるワークスペース間の結合ではサポートされていません。
  • サブクエリを WHERE 句として使用することはできません (例: POP_2010 = (SELECT min(POP_2010) FROM counties)。
  • Microsoft Azure SQL Database などのデータベース サービスからのクエリはサポートされていません。

ArcGIS Online でサポートされている SQL 関数

データベース固有の WHERE 句構文を現在使用しているアプリ開発者は、アプリのコード内にある WHERE 句を更新して、ArcGIS Online でサポートされている一般的な SQL 構文を使用する必要があります。 サポートされている SQL 関数と各関数の構文を次の表に示します。 アプリ内で次の関数と構文が使用されている場合、ArcGIS Online では、フィーチャ レイヤーで使用されているデータベースの仕様に合わせてこれらの関数と構文が変換されます。

日付関数

関数説明

CURRENT_DATE()

現在の日付を UTC 時間で返します。

表示される値は、使用しているクライアントによって異なります。 ArcGIS Online の日付は、組織またはプロフィールのタイム ゾーンで表示されます。

CURRENT_TIME()

現在の UTC の日付と時刻 (時間、分、秒) を返します。

表示される値は、使用しているクライアントによって異なります。 ArcGIS Online の時刻は、組織またはプロフィールの現地時間で表示されます。

CURRENT_TIMESTAMP()

現在の UTC の日付と時刻 (時間、分、秒、ミリ秒) を返します。

表示される値は、使用しているクライアントによって異なります。 ArcGIS Online の時刻は、組織またはプロフィールの現地時間で表示されます。

EXTRACT(<unit> FROM <date>)

指定した <date> の一部 (<unit>) を返します。 出力される可能性のある <unit> 値は、yearmonthdayhourminute です (ただし、これらに限定されません)。

次の例では、日時の値 2016-12-21 15:11 からさまざまな単位を抽出します。

  • EXTRACT(MONTH FROM TIMESTAMP '2016-12-21 15:11:00') - 12 を返します。
  • EXTRACT(DAY FROM TIMESTAMP '2016-12-21 15:11:00') - 21 を返します。
  • EXTRACT(HOUR FROM TIMESTAMP '2016-12-21 15:11:00') - 15 を返します。

数値関数

関数説明

ABS(<number>)

指定した数値の絶対値 (正の値) を返します。

CAST(<number> AS FLOAT | INT)

数値を別のタイプに変換します。 FLOAT は指定した number を double に変換し、INT は整数に変換します。

以下の最初の例では、number が整数に変換されます。 整数は自然数であるため、結果は 1424 となります。 2 番目の例では、整数が浮動小数点に変換され、結果は小数点以下の桁がある number 1424.0 になります

  • CAST(1424.49 AS INT)
  • CAST(1424 AS FLOAT

CEILING(<number>)

指定した数値以上で、最も小さな整数を返します。

次の例は 13 を返します。

CEILING(12.93)

COS(<number>)

<number> の角度の余弦を返します。角度の単位はラジアンです。

FLOOR(<number>)

指定した number 以下の最も大きい整数を返します。

次の例は 12 を返します。

FLOOR(12.93)

LOG(<number>)

指定した number の自然対数。

LOG10(<number>)

指定した number の常用対数です。

MOD(<number>, <n>)

被除数 (<number>) を除数 <n> で除算したときの余りを返します。 <n> と <number> のタイプは、整数である必要があります。

次のようなケースがあります。

  • MOD(10, 4) - 結果は 2 です。
  • MOD(CAST(DBLFIELD AS INT), 4) - DBLFIELD はタイプが double のフィールドであるため、値を double から整数に変換するために CAST 関数が必要です。

NULLIF(<number>, <value>)

指定した number が指定した値と同じ場合、null を返します。 NULLIF は、<value> を 0 に設定してゼロ除算エラーを防ぐためによく使用されます。

引数のフィールド値が null であった場合、計算結果は null です。

たとえば、TOTALPOPPOP18 で除算する double フィールドを計算する必要があるとします。 フィーチャにゼロである POP18 値が含まれている場合に、この計算を実行すると、ゼロ除算エラーが発生します。 この場合、POP18 がゼロであるレコードを非表示にするフィルターを作成して、計算を実行できます。 この場合、NULLIF を使用すると簡単です。

TOTALPOP / NULLIF(POP18, 0) - POP18 がゼロと等しい場合は null を返し、それ以外の場合は TOTALPOP / POP18 の値を返します。

POWER(<number> , <y>)

指定した number を指定した乗数 (<y>) で累乗した値を返します。

次の例は 32768 を返します。

POWER(8,5)

ROUND(<number> , <length>)

指定する number を指定した長さに丸めます。

<length> に正の数を使用する場合、その桁数まで小数点の右側が丸められます。 <length> が負の数の場合、指定した <number> の桁数まで小数点の左側が丸められます。

次に例を示します。

  • ROUND(10.9934,2) - 10.99 を返します。
  • ROUND(10.9964,2) - 11.00 を返します。
  • ROUND(111.0,-2) - 100.00 を返します。

SIN(<number>)

指定した <number> の角度の正弦を返します。角度の単位はラジアンです。

TAN(<number>)

指定した <number> の角度の正接を返します。角度の単位はラジアンです。

TRUNCATE(<number>,<decimal_place>)

指定した <decimal_place><number> を切り捨てます。

<decimal_place> が正の場合、指定した小数点以下の桁数に切り捨てられます。 <decimal_place> が負の数の場合、<number> は小数点の左側が丸められます。

最初の例では、その桁数まで小数点の右側の数値が切り捨てられ、2 桁のみが含まれるようになるため、結果の値は 111.99 になります。 2 番目の例では、その桁数まで小数点の左側が切り捨てられ、結果の値は 100.00 になります。

  • TRUNCATE(111.996,2)
  • TRUNCATE(111.996,-2)

文字列関数

関数説明

CAST(<string> AS DATE | TIME)

文字列値がサポートされている形式の場合、文字列を日付または時刻に変換します。

文字列が 'MM/DD/YYYY hh:mm:ss' または 'YYYY-MM-DD' 形式の場合、日付に変換できます。 文字列が 'HH:MM:SS' 形式の場合、time only データ タイプ (TIME) に変換できます。

たとえば、以下の文字列は日付に変換できます。

CAST('1988-05-30' AS DATE)

CHAR_LENGTH(<string>)

指定した string の文字数を返します。 結果は整数です。

たとえば、以下のステートメントは 8 を返します。

CHAR_LENGTH('Redlands')

CONCAT(<string1>, <string2>)

2 つの文字列値を連結します

指定できるのは、2 つの文字列だけです。 3 つ以上の文字列を連結するには、次のように CONCAT 関数を連続して使用してネストします。

以下の最初の例では、文字 A と文字 B を連結します。 2 番目の例は、3 つの文字列値 (A、:、B) を連結する、ネストされた CONCAT 関数を示しています。

  • CONCAT('A', 'B') - 結果は 'AB' です。
  • CONCAT('A', CONCAT(':', 'B')) - 結果は 'A:B' です。

NULL 値は空の文字列に変換されます。

CURRENT_USER

CURRENT_USER 関数がクエリに含まれる場合、この関数は変数と同様に動作し、ホスト フィーチャ レイヤーまたはホスト フィーチャ レイヤー ビューにアクセスするユーザーのユーザー名が識別され、クエリで使用されます。

たとえば、planner3 というユーザーが組織にサイン インして、次のクエリ定義を含むホスト フィーチャ レイヤー ビューにアクセスする場合、staffmember フィールドに planner3 という値を含むフィーチャのみが接続しているユーザーに返されます。

staffmember=current_user

次の例では、staffmember フィールドに複数の値が格納されています。 次の where 句は、staffmember フィールドに複数のユーザー名が格納されている場合でも、staffmember フィールドのテキスト値から現在のユーザー名を検索します。

where=position(current_user in staffmember)>0

POSITION(<substring>, <string>)

指定する string 内で指定した substring が最初に現れる位置を返します。 指定した substring が見つからない場合、結果は 0 になります。

以下の最初の例では、string (Sailboat) の 5 番目の文字が substring (boat) の最初の文字 (b) であるため、結果は 5 になります。 2 番目の例では、string 内に substring (motor) が存在しないため、結果は 0 になります。

  • POSITION('boat', 'Sailboat')
  • POSITION('motor', 'Sailboat')

SUBSTRING(<string>, <start>, <length>)

string の値の一部を返します。<start> は、返される文字列の開始位置を指定する整数インデックスであり、<length> は返される文字数です。

以下の例をご参照ください。

  • SUBSTRING('Sailboat', 5, 4) - 結果は 'boat' です。
  • SUBSTRING('Sailboat', 1, 4) - 結果は 'Sail' です。
  • SUBSTRING('Sailboat', 5, 100) - 結果は 'boat' です。

TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>)

指定する string の先頭または末尾にあるすべての空白を削除した文字列を返します。

次の例では、文字列 (San Bernardino) の前後にスペースが存在します。 キーワード BOTH は、テキスト文字列の先頭と末尾にある空白文字列 (間に 1 つの空白を含む 2 つの単一引用符を使用して示される) を切詰めるために使用されます。

TRIM(BOTH ' ' FROM ' San Bernardino ')

これにより、文字列 'San Bernardino' が返されます。

UPPER(<string>)

すべての文字を大文字に変換した文字列を返します。

この例では、文字列 Sailboat のすべての文字が大文字に変換され、文字列 'SAILBOAT' が返されます。

UPPER('Sailboat')

LOWER(<string>)

すべての文字を小文字に変換した文字列を返します。

次の例では、'sailboat' が返されます。

LOWER('Sailboat')