共用方式為


查詢加速 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)。

另請參閱