1. 含義
類似于Java中的類的概念。包含很多類的屬性。
2. 場景
什麼樣的資料,适合使用struct類型來存儲呢?這裡列舉了幾個我在開發中實際用到的場景。
2.1 多個具有相同字首的字段
其實struct完全可以拆成多個字段。但是對于比較寬的表而言,會有如下特征:
(1)字段數很多,幾百個甚至更多;
(2)相近含義的字段,會放到相鄰的位置或者使用相同的字首,以便查找;
對于這種字段,可以考慮放到一個struct裡,減少表的字段數,更加友善查找。但是資料字典的維護,依然是比較麻煩的問題。
2.2 對象清單
對象有多種固定的屬性,簡單的key-value格式無法滿足,可以使用array嵌套struct的方式定義。減少了維護資料字典的工作量。
3. 玩轉struct
3.1 構造struct
3.1.1 struct
SELECT STRUCT(4,'趙六','男') AS c;
c |
---|
{"col1":4,"col2":"趙六","col3":"男"} |
在沒有指定struct内具體字段名的時候,預設為col1、col2、col3、……。是以取值的時候也是這樣取,如下:
SELECT STRUCT(4,'趙六','男').col3 AS c;
男 |
3.1.2 named_struct
SELECT NAMED_STRUCT('id',3,'name','王五','gender','男') AS c;
{"id":3,"name":"王五","gender":"男"} |
指定了struct内具體字段名,則named_struct的參數數量必須為偶數,分别是key1、value1、key2、value2、key3、value3、……。是以取值的時候也是這樣取,如下:
SELECT NAMED_STRUCT('id',3,'name','王五','gender','男').gender AS c;
3.2 橫縱雙向展開struct數組
例如現在有這樣一張表:
[{id:1, name:張三, gender:男}, {id:3, name:王五, gender:男}, {id:2, name:李四, gender:男}] |
現在想橫向、縱向都展開,成多行多列格式,那麼就這樣做:
SELECT INLINE(c) FROM `test_table`;
id | name | gender |
---|---|---|
1 | 張三 | |
3 | 王五 | |
2 | 李四 |
但是這種做法自由度太低,是以很少會使用到。
4. 常見用法
- struct這種類型,更多的是應用在資料存儲上。不像array、map還會出現在複雜SQL的中間過程,用于做行列轉換等操作。
- struct作為表結構中的字段,可以單獨使用,或者是跟array聯用,來存儲數量不固定的對象資料。在建立表的時候,需要指定好struct内部的字段名、字段類型。
- struct大概是三個複雜類型之中,出場率最低的一個。絕大部分人都隻接觸過array和map,而幾乎沒使用過struct。