查詢加速支援 ANSI 類似 SQL 的語言,以在 Blob 內容上表達查詢。 查詢加速 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 表示式的一部分(例如 )。 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。 依序數參考欄位對於不包含標頭數據列的 CSV 格式數據很有用,在此情況下,參考特定欄位的唯一方法是序數。
運營商
支援下列標準 SQL 運算子:
| 操作員 | 說明 |
|---|---|
= |
比較兩個表達式的相等性(比較運算符)。 |
!= |
測試某個表達式是否不等於另一個表達式(比較運算符)。 |
<> |
比較兩個表達式不等於 (比較運算符)。 |
< |
比較兩個表達式小於 (比較運算符)。 |
<= |
比較兩個小於或等於的表達式(比較運算符)。 |
> |
比較兩個大於的表達式(比較運算符)。 |
>= |
比較兩個大於或等於的表達式(比較運算符)。 |
+ |
兩個數字相加。 這個加法運算運算子也可以將數位,以天為單位新增至日期。 |
- |
減去兩個數位(算術減法運算元)。 |
/ |
將一個數位除以另一個數位(算術除法運算符)。 |
* |
將兩個表達式相乘(算術乘法運算符)。 |
% |
傳回一個數位除以另一個數位的餘數。 |
AND |
在兩個整數值之間,執行位元邏輯 AND 運算。 |
OR |
在兩個指定的整數值之間執行位邏輯 OR 運算,以轉譯為 Transact-SQL 語句內的二進位表達式。 |
NOT |
否定布爾值輸入。 |
CAST |
將某個數據類型的表達式轉換成另一個數據類型。 |
BETWEEN |
指定要測試的範圍。 |
IN |
判斷指定的值是否符合子查詢或清單中的任何值。 |
NULLIF |
如果兩個指定的表達式相等,則傳回 Null 值。 |
COALESCE |
依序評估自變數,並傳回最初未評估為 NULL 之第一個表達式的目前值。 |
如果運算子左邊和右邊的數據類型不同,則會根據此處指定的規則執行自動轉換: 資料類型優先順序 (Transact-SQL) 。
查詢加速 SQL 語言僅支援該文章所討論的數據類型非常小的子集。 請參閱本文的 數據類型 一節。
轉型
查詢加速 SQL 語言支援 CAST 運算子,根據這裡的規則: 數據類型轉換 (Database Engine)。
查詢加速 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_ADDDATE_DIFFEXTRACTTO_STRINGTO_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 位數格式的年份 |
| M | 年月 - 1 |
| 毫米 | 零填補月份 - 01 |
| 嗯 | 年度縮寫月份 - JAN |
| 嗯 | 完整月份 - 5 月 |
| d | 當月日 (1-31) |
| dd | 當月零填補日 (01-31) |
| 一 | AM 或 PM |
| h | 一天中的一小時 (1-12) |
| 呵呵 | 當天零填補時數 (01-12) |
| H | 一天中的小時 (0-23) |
| HH | 每天零填補小時 (00-23) |
| m | 小時分鐘 (0-59) |
| 毫米 | 零填補分鐘 (00-59) |
| s | 分鐘秒 (0-59) |
| ss | 零填補秒 (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 語句可能包含一或多個投影表示式或單一匯總運算式。 支援下列匯總表示式:
| 表現 | 說明 |
|---|---|
| COUNT\ | 傳回符合述詞表達式的記錄數目。 |
| COUNT(expression) | 傳回表達式為非 Null 的記錄數目。 |
| AVG(expression) | 傳回表達式非 Null 值的平均值。 |
| MIN(expression) | 傳回表達式的最小非 Null 值。 |
| MAX(expression | 傳回表達式的最大非 Null 值。 |
| SUM(expression) | 傳回表達式所有非 Null 值的總和。 |
失蹤
運算符 IS MISSING 是唯一查詢加速 SQL 語言支援的非標準。 針對 JSON 數據,如果特定輸入記錄中遺漏欄位,則表達式欄位 IS MISSING 會評估為 Boolean 值 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
這是 SELECT 語句的特殊形式,僅適用於 CSV 格式的數據。
SELECT sys.split(split_size) FROM BlobStorage
如果您想要下載 CSV 數據記錄,然後分批處理 CSV 數據記錄,請使用此語句。 如此一來,您就可以平行處理記錄,而不必一次下載所有記錄。 此語句不會從 CSV 檔案傳回記錄。 相反地,它會傳回批次大小的集合。 然後,您可以使用每個批次大小來擷取一批數據記錄。
使用 split_size 參數來指定您希望每個批次包含的位元元組數目。 例如,如果您想要一次只處理 10 MB 的數據,您的語句看起來會像這樣: SELECT sys.split(10485760)FROM BlobStorage 因為 10 MB 等於 10,485,760 個字節。 每個批次都會包含符合這些 10 MB 的記錄數目。
在大部分情況下,每個批次的大小會略高於您指定的數位。 這是因為批次不能包含部分記錄。 如果批次中的最後一筆記錄在閾值結束前開始,批次將會變大,使其可以包含完整記錄。 最後一個批次的大小可能會小於您指定的大小。
備註
split_size至少必須是 10 MB(10485760)。