查詢加速 SQL 語言參考
查詢加速支援類似 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 格式的資料,table 是「資料表描述項」。請參閱本文的資料表描述項一節。
在下列範例中,針對 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 位元帶正負號的整數。 |
FLOAT | 64 位元 (「雙精確度」) 浮點數。 |
字串 | 可變長度的 Unicode 字串。 |
timestamp | 時間點。 |
BOOLEAN | true 或 false。 |
從 CSV 格式化的資料讀取值時,所有值都會當成字串讀取。 您可以使用 CAST 運算式,將字串值轉換成其他類型。 值可能會依據內容,隱含地轉換成其他類型。 如需詳細資訊,請參閱資料類型優先順序 (Transact-SQL)。
運算式
參考欄位
若是 JSON 格式的資料或具有標頭資料列的 CSV 格式資料,則可以按名稱參照欄位。 欄位名稱可以用引號括住,也可以不加引號。 加上引號的欄位名稱會以雙引號字元括住 ("
),其中可能含有空格且要區分大小寫。 未加引號的欄位名稱不區分大小寫,且不能含有任何特殊字元。
在 CSV 格式的資料中,也可以按照序數並在前面加上底線 (_
) 字元參照欄位。 例如,可以使用 _1
參照第一個欄位 ,或使用 _11
參照第十一個欄位。 依序數參照欄位適用於 CSV 格式的資料,其中不含標頭資料列,在此情況下,參照特定欄位的唯一方式是依序數。
操作員
以下是支援的標準 SQL 運算子:
運算子 | 描述 |
---|---|
= |
比較兩個運算式是否相等 (比較運算子)。 |
!= |
測試一個運算式是否等於另一個運算式 (比較運算子)。 |
<> |
比較不等於 (比較運算子) 的兩個運算式。 |
< |
比較小於 (比較運算子) 的兩個運算式。 |
<= |
比較小於或等於 (比較運算子) 的兩個運算式。 |
> |
比較大於 (比較運算子) 的兩個運算式。 |
>= |
比較大於或等於 (比較運算子) 的兩個運算式。 |
+ |
兩個數字相加。 這個加法算術運算子也可以在日期中加入數字 (表示天數)。 |
- |
執行兩個數字的減法運算 (算術減法運算子)。 |
/ |
將一個數字除以另一個數字 (算術除法運算子)。 |
* |
乘以兩個運算式 (算術乘法運算子)。 |
% |
傳回某個數值除以另一個數值的餘數。 |
AND |
在兩個整數值之間,執行位元邏輯 AND 運算。 |
OR |
在 Transact-SQL 陳述式中轉換成二進位運算式時,執行兩個指定整數值之間的位元邏輯 OR 運算。 |
NOT |
執行布林輸入的否定運算。 |
CAST |
將一種資料類型的運算式轉換成另一種。 |
BETWEEN |
指定要測試的範圍。 |
IN |
判斷指定的值是否符合子查詢或清單中的任何值。 |
NULLIF |
如果兩個指定的運算式相等,便傳回 Null 值。 |
COALESCE |
依序評估引數,並傳回一開始未評估為 NULL 的第一個運算式目前值。 |
如果運算子左邊和右邊的資料類型不同,則會根據此處指定的規則來執行自動轉換:資料類型優先順序 (Transact-SQL)。
查詢加速 SQL 語言僅支援該文章所討論的資料類型中的極小部分。 請參閱本文的資料類型一節。
轉型
查詢加速 SQL 語言會根據以下規則支援 CAST 運算子:資料類型轉換 (資料庫引擎)。
查詢加速 SQL 語言僅支援該文章所討論的資料類型中的極小部分。 請參閱本文的資料類型一節。
字串函數
查詢加速 SQL 語言支援下列標準 SQL 字串函數:
函式 | 描述 |
---|---|
CHAR_LENGTH | 如果字串運算式是字元資料類型,則會傳回字串運算式的長度 (以字元為單位);否則,會傳回字串運算式的長度 (以位元組為單位),且最小整數不小於位元數除以 8 的結果。 (此函數與 CHARACTER_LENGTH 函數相同。) |
CHARACTER_LENGTH | 如果字串運算式是字元資料類型,則會傳回字串運算式的長度 (以字元為單位);否則,會傳回字串運算式的長度 (以位元組為單位),且最小整數不小於位元數除以 8 的結果。 此函數與 CHAR_LENGTH 函數相同 |
LOWER | 將大寫字元資料轉換成小寫之後,傳回字元運算式。 |
UPPER | 傳回小寫字元資料轉換成大寫的字元運算式。 |
SUBSTRING | 在 SQL Server 中傳回字元、二進位、文字或影像運算式的一部分。 |
TRIM | 從字串的開頭和結尾移除空白字元 char(32) 或其他指定字元。 |
LEADING | 從字串的開頭移除空白字元 char(32) 或其他指定字元。 |
TRAILING | 從字串的結尾移除空白字元 char(32) 或其他指定字元。 |
以下提供數個範例:
函式 | 範例 | 結果 |
---|---|---|
CHARACTER_LENGTH | SELECT CHARACTER_LENGTH('abcdefg') from BlobStorage |
7 |
CHAR_LENGTH | SELECT CHAR_LENGTH(_1) from BlobStorage |
1 |
LOWER | SELECT LOWER('AbCdEfG') from BlobStorage |
abcdefg |
UPPER | SELECT UPPER('AbCdEfG') from BlobStorage |
ABCDEFG |
SUBSTRING | SUBSTRING('123456789', 1, 5) |
23456 |
TRIM | 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 |
MM | 加零填補的月份 - 01 |
MMM | 縮寫 一年中的月份 - 一月 |
MMMM | 整月 - 五月 |
d | 當月日期 (1-31) |
dd | 加零填補的當月日期 (01-31) |
a | 上午或下午 |
小時 | 當日時間 (1-12) |
hh | 加零填補的當日時間 (01-12) |
H | 當日時間 (0-23) |
HH | 加零填補的當日時間 (00-23) |
m | 一小時的分鐘數 (0-59) |
mm | 加零填補的分鐘 (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(運算式) | 傳回運算式的非 null 值平均值。 |
MIN(expression) | 傳回運算式的最小非 null 值。 |
MAX(expression | 傳回運算式的最大非 null 值。 |
SUM(expression) | 傳回運算式的所有非 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
這是 SELECT 陳述式的特殊格式,僅適用於 CSV 格式的資料。
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)。