次の方法で共有


クエリ アクセラレーション SQL 言語リファレンス

クエリ アクセラレーションでは、BLOB コンテンツに対するクエリを表現するための ANSI SQL に似た言語がサポートされています。 クエリ アクセラレーション SQL 言語は ANSI SQL のサブセットであり、サポートされているデータ型や演算子などのセットが限られていますが、ANSI SQL 上でも拡張され、JSON などの階層的な半構造化データ形式に対するクエリがサポートされます。

SELECT 構文

クエリ アクセラレーションでサポートされる SQL ステートメントは SELECT ステートメントだけです。 次の使用例は、式が true を返すすべての行を返します。

SELECT * FROM table [WHERE expression] [LIMIT limit]

CSV 形式のデータの場合、 テーブルBlobStorageする必要があります。 つまり、REST 呼び出しで指定された BLOB に対してクエリが実行されます。 JSON 形式のデータの場合、 テーブル は "テーブル記述子" です。この記事の 「テーブル記述子」 セクションを参照してください。

次の例では、WHERE 式が true を返す各行について、このステートメントは各プロジェクション の評価から作成された新しい行を返します。

SELECT expression [, expression ...] FROM table [WHERE expression] [LIMIT limit]

SELECT 式の一部として 1 つ以上の特定の列 (たとえば、 SELECT Title, Author, ISBN) を指定できます。

SELECT 式で使用できる特定の列の最大数は 49 です。 SELECT ステートメントで 49 列を超える列を返す必要がある場合は、SELECT 式にワイルドカード文字 (*) を使用します (例: SELECT *)。

次の例では、 が true を返す行ごとに集計計算 (たとえば、特定の列の平均値) を返します。

SELECT aggregate_expression FROM table [WHERE expression] [LIMIT limit]

次の例では、CSV 形式の BLOB を分割するための適切なオフセットを返します。 この記事の Sys.Split セクションを参照してください。

SELECT sys.split(split_size)FROM BlobStorage

データ型

データ型 説明
INT 64 ビット符号付き整数。
浮く 64 ビット ("倍精度") 浮動小数点。
可変長 Unicode 文字列。
タイムスタンプ ポイント イン タイム。
ブーリアン 真か偽か

CSV 形式のデータから値を読み取ると、すべての値が文字列として読み取られます。 文字列値は、CAST 式を使用して他の型に変換できます。 値は、コンテキストに応じて他の型に暗黙的にキャストされる場合があります。 詳細については、「 データ型の優先順位 (Transact-SQL)」を参照してください。

フィールドの参照

JSON 形式のデータ、またはヘッダー行を含む CSV 形式のデータの場合、フィールドは名前で参照できます。 フィールド名は引用符または引用符で囲む必要があります。 引用符で囲まれたフィールド名は、二重引用符 (") で囲まれており、スペースを含む場合があり、大文字と小文字が区別されます。 引用符で囲まれていないフィールド名では大文字と小文字が区別されず、特殊文字を含めなくてもかまいません。

CSV 形式のデータでは、フィールドの先頭にアンダースコア (_) 文字が付いた序数でフィールドを参照することもできます。 たとえば、最初のフィールドを _1として参照することも、11 番目のフィールドを _11 として参照することもできます。 序数によるフィールドの参照は、ヘッダー行を含まない CSV 形式のデータに役立ちます。この場合、特定のフィールドを参照する唯一の方法は序数です。

オペレーター

次の標準 SQL 演算子がサポートされています。

オペレーター 説明
= 2 つの式 (比較演算子) の等価性を比較します。
!= 1 つの式が別の式 (比較演算子) と等しくないかどうかをテストします。
<> 等しくない 2 つの式を比較します (比較演算子)。
< より小さい (比較演算子) の 2 つの式を比較します。
<= 2 つの式を比較し、次の値以下を比較します (比較演算子)。
> より大きい (比較演算子) の 2 つの式を比較します。
>= 以上の 2 つの式を比較します (比較演算子)。
+ 2 つの値を加算します。 この加算算術演算子は、日付に数値 (日数) を追加することもできます。
- 2 つの数値 (算術減算演算子) を減算します。
/ 1 つの数値を別の数値で除算します (算術除算演算子)。
* 2 つの式 (算術乗算演算子) を乗算します。
% 1 つの数値を別の数値で除算した剰余を返します。
AND 2 つの整数値の間でビットごとの論理積演算を実行します。
OR ステートメント内のバイナリ式に変換された、指定された 2 つの整数値の間でビットごとの論理 OR 演算 Transact-SQL 実行します。
NOT ブール型の入力を否定します。
CAST あるデータ型の式を別のデータ型に変換します。
BETWEEN テスト範囲を指定します。
IN 指定した値がサブクエリまたはリスト内の任意の値と一致するかどうかを判断します。
NULLIF 指定した 2 つの式が等しい場合は、null 値を返します。
COALESCE 引数を順番に評価し、最初に NULL に評価されない最初の式の現在の値を返します。

演算子の左右のデータ型が異なる場合、自動変換は、データ 型の優先順位 (Transact-SQL) で指定された規則に従って実行されます。

クエリ アクセラレーション SQL 言語では、その記事で説明されているデータ型のごく一部のみがサポートされます。 この記事の 「データ型」 セクションを参照してください。

キャスト

クエリ アクセラレーション SQL 言語では、データ 型変換 (データベース エンジン) の規則に従って CAST 演算子がサポートされます。

クエリ アクセラレーション SQL 言語では、その記事で説明されているデータ型のごく一部のみがサポートされます。 この記事の 「データ型」 セクションを参照してください。

文字列関数

クエリ アクセラレーション SQL 言語では、次の標準 SQL 文字列関数がサポートされています。

機能 説明
CHAR_LENGTH 文字列式のデータ型が文字である場合は、文字列式の文字の長さを返します。それ以外の場合は、文字列式の長さをバイト単位 (ビット数を 8 で割った数より小さい最小の整数) で返します (この関数は CHARACTER_LENGTH 関数と同じです)。
CHARACTER_LENGTH 文字列式のデータ型が文字である場合は、文字列式の文字の長さを返します。それ以外の場合は、文字列式の長さをバイト単位 (ビット数を 8 で割った数より小さい最小の整数) で返します (この関数は、CHAR_LENGTH関数と同じです
下げる 大文字データを小文字に変換した後の文字式を返します。
アッパー 小文字データが大文字に変換された文字式を返します。
サブストリング SQL Server で、文字、バイナリ、テキスト、またはイメージ型の式の一部を返します。
刈る 文字列の先頭と末尾からスペース文字 char(32) またはその他の指定された文字を削除します。
トップ 文字列の先頭からスペース文字 char(32) またはその他の指定された文字を削除します。
末尾 文字列の末尾からスペース文字 char(32) またはその他の指定された文字を削除します。

以下にいくつか例を示します。

機能 結果
CHARACTER_LENGTH SELECT CHARACTER_LENGTH('abcdefg') from BlobStorage 7
CHAR_LENGTH SELECT CHAR_LENGTH(_1) from BlobStorage 1
下げる SELECT LOWER('AbCdEfG') from BlobStorage abcdefg
アッパー SELECT UPPER('AbCdEfG') from BlobStorage ABCDEFG
サブスト リング SUBSTRING('123456789', 1, 5) 23456
刈る TRIM(BOTH '123' FROM '1112211Microsoft22211122') Microsoft

データ関数

次の標準 SQL 日付関数がサポートされています。

  • DATE_ADD
  • DATE_DIFF
  • EXTRACT
  • TO_STRING
  • TO_TIMESTAMP

現在、 標準IS08601のすべての日付形式 が変換されています。

DATE_ADD関数

クエリ アクセラレーション SQL 言語では、 DATE_ADD 関数の年、月、日、時、分、秒がサポートされます。

例:

DATE_ADD(datepart, quantity, timestamp)
DATE_ADD('minute', 1, CAST('2017-01-02T03:04:05.006Z' AS TIMESTAMP)

DATE_DIFF関数

クエリ アクセラレーション SQL 言語では、 DATE_DIFF 関数の年、月、日、時、分、秒がサポートされます。

DATE_DIFF(datepart, timestamp, timestamp)
DATE_DIFF('hour','2018-11-09T00:00+05:30','2018-11-09T01:00:23-08:00') 

EXTRACT 関数

DATE_ADD関数でサポートされている日付部分以外の EXTRACT の場合、クエリ アクセラレーション SQL 言語では、日付部分としてtimezone_hourとtimezone_minuteがサポートされます。

例:

EXTRACT(datepart FROM timestampstring)
EXTRACT(YEAR FROM '2010-01-01T')

TO_STRING関数

例:

TO_STRING(TimeStamp , format)
TO_STRING(CAST('1969-07-20T20:18Z' AS TIMESTAMP),  'MMMM d, y')

次の表では、 TO_STRING 関数の出力形式を指定するために使用できる文字列について説明します。

文字列の書式設定 アウトプット
yy 2 桁の形式の年 - 1999 年 ('99')
y 4 桁の形式の年
yyyy 4 桁の形式の年
エム 年の月 - 1
ミリメートル ゼロ埋め込み月 - 01
うー ん 年の省略された月 - JAN
うー ん 完全な月 - 5 月
d 月の日 (1 から 31)
dd 月の埋め込み日がゼロ (01 から 31)
ある AM または PM
h 1 日の時間 (1 から 12)
hh 1 日のゼロ 埋め込み時間 (01 から 12)
H 1 日の時間 (0 から 23)
HH 1 日の 0 時間埋め込み (00 から 23)
m 時間の分 (0 から 59)
ミリメートル ゼロ 埋め込み分 (00 から 59)
s 分の秒 (0 から 59)
エスエス ゼロ 埋め込み秒 (00 から 59)
S 秒の分数 (0.1 から 0.9)
SS 秒の分数 (0.01 から 0.99)
SSS 秒の分数 (0.001-0.999)
X オフセット (時間単位)
XX または XXXX 時間と分単位のオフセット (+0430)
XXX または XXXXX 時間と分単位のオフセット (-07:00)
x オフセット (時間単位) (7)
xx または xxxx 時間と分のオフセット (+0530)
Xxx または xxxxx 時間と分のオフセット (+05:30)

TO_TIMESTAMP関数

IS08601形式のみがサポートされています。

例:

TO_TIMESTAMP(string)
TO_TIMESTAMP('2007T')

UTCNOW関数を使用してシステム時刻を取得することもできます。

集計式

SELECT ステートメントには、1 つ以上のプロジェクション式または単一の集計式を含める場合があります。 次の集計式がサポートされています。

表現 説明
COUNT(*) 述語式と一致したレコードの数を返します。
COUNT(expression) 式が null 以外のレコードの数を返します。
AVG(expression) 式の null 以外の値の平均を返します。
MIN(式) 式の null 以外の最小値を返します。
MAX(expression 式の null 以外の最大値を返します。
SUM(式) 式のすべての null 以外の値の合計を返します。

行方不明

IS MISSING演算子は、クエリ アクセラレーション SQL 言語がサポートする唯一の非標準です。 JSON データの場合、フィールドが特定の入力レコードに存在しない場合、 IS MISSING 式フィールドはブール値 true に評価されます。

テーブル記述子

CSV データの場合、テーブル名は常に BlobStorage。 例えば次が挙げられます。

SELECT * FROM BlobStorage

JSON データの場合、追加のオプションを使用できます。

SELECT * FROM BlobStorage[*].path

これにより、JSON データのサブセットに対するクエリが可能になります。

JSON クエリの場合は、FROM 句の一部でパスを指定できます。 これらのパスは、JSON データのサブセットを解析するのに役立ちます。 これらのパスは、JSON 配列とオブジェクトの値を参照できます。

これを詳しく理解する例を見てみましょう。

これはサンプル データです。

{
  "id": 1,
  "name": "mouse",
  "price": 12.5,
  "tags": [
    "wireless",
    "accessory"
  ],
  "dimensions": {
    "length": 3,
    "width": 2,
    "height": 2
  },
  "weight": 0.2,
  "warehouses": [
    {
      "latitude": 41.8,
      "longitude": -87.6
    }
  ]
}

上記のデータの warehouses JSON オブジェクトにのみ関心がある場合があります。 warehouses オブジェクトは JSON 配列型であるため、FROM 句でこれを指定できます。 サンプル クエリは次のようになります。

SELECT latitude FROM BlobStorage[*].warehouses[*]

クエリはすべてのフィールドを取得しますが、緯度のみを選択します。

dimensions JSON オブジェクト値にのみアクセスする場合は、クエリでそのオブジェクトを参照できます。 例えば次が挙げられます。

SELECT length FROM BlobStorage[*].dimensions

これにより、 dimensions オブジェクトのメンバーへのアクセスも制限されます。 JSON フィールドの他のメンバーと JSON オブジェクトの内部値にアクセスする場合は、次の例に示すようなクエリを使用できます。

SELECT weight,warehouses[0].longitude,id,tags[1] FROM BlobStorage[*]

BlobStorage と BlobStorage[*] はどちらもオブジェクト全体を参照します。 ただし、FROM 句にパスがある場合は、BlobStorage[*].path を使用する必要があります。

Sys.Split

これは、CSV 形式のデータに対してのみ使用できる SELECT ステートメントの特殊な形式です。

SELECT sys.split(split_size) FROM BlobStorage

CSV データ レコードをダウンロードしてバッチ処理する場合は、このステートメントを使用します。 こうすることで、すべてのレコードを一度にダウンロードする必要なく、レコードを並列で処理できます。 このステートメントは、CSV ファイルからレコードを返しません。 代わりに、バッチ サイズのコレクションを返します。 その後、各バッチ サイズを使用して、データ レコードのバッチを取得できます。

split_size パラメーターを使用して、各バッチに含めるバイト数を指定します。 たとえば、一度に 10 MB のデータのみを処理する場合、ステートメントは次のようになります。 SELECT sys.split(10485760)FROM BlobStorage 、10 MB は 10,485,760 バイトに等しいからです。 各バッチには、これらの 10 MB に収まる数のレコードが含まれます。

ほとんどの場合、各バッチのサイズは、指定した数よりも少し大きくなります。 これは、バッチに部分レコードを含めることができないためです。 バッチ内の最後のレコードがしきい値の終了前に開始される場合、バッチは大きくなり、完全なレコードを含めることができます。 最後のバッチのサイズは、指定したサイズよりも小さい可能性があります。

split_sizeは少なくとも 10 MB (10485760) である必要があります。

こちらも参照ください