萬用字元列是指列名由萬用字元組成的列,多用於模糊比對、動態列寫入等情境,可以更靈活地匹配和尋找目標列。在Lindorm寬表引擎中使用萬用字元列,可以滿足多資料類型動態寫入的需求。本文介紹萬用字元列的使用限制及使用方法。
背景資訊
在巨量資料量的情境下,傳統SQL通常無法滿足業務需求。例如車連網情境,資料通常有幾百甚至上千個列,且這些列多數情況下並不是固定的。如果此時想要寫入新的列,則需要執行ALTER TABLE語句,這樣的操作非常影響寫入效率。
Lindorm支援動態列,可以動態寫入資料並執行查詢。但動態列支援的資料類型較少,目前僅支援VARBINARY類型的資料寫入。為解決這一問題,Lindorm推出萬用字元列,協助您實現多資料類型動態列的寫入。
萬用字元列名目前支援的萬用字元為星號(*)和英文問號(?)。系統會將萬用字元匹配到的列中的資料轉換為指定資料類型。詳細規則如下:
英文問號(?)可以匹配任何單個字元。
星號(*)可以匹配任一字元序列,包括Null 字元序列。
例如,在表結構中加入萬用字元列c* int
,則可以任意寫入列名以“c”開頭的列(例如c10、c11、c20等),並且這些列中的資料都會被轉換為INT資料類型。
前提條件
使用限制
萬用字元列不能作為主鍵。
對於包含萬用字元列的表,使用
SELECT *
語句進行查詢時,必須添加LIMIT限制。例如,SELECT * FROM t_dynamic_columns LIMIT 10;
僅支援為萬用字元列建立搜尋索引,不支援二級索引。例如,不支援
CREATE INDEX idx on tb(c2*)
。不支援使用含萬用字元的列名進行資料查詢。SELECT和WHERE條件中必須填寫實際的列名,不支援填寫萬用字元列名。例如,不支援
SELECT c1*,c2 WHERE c2 > 10;
或SELECT c1*,c2 WHERE c1* > 10;
。正確文法例如SELECT pk, c1, c2, c21, c31 WHERE c21 > 10 AND c31 < 'c300'
。
DDL
表
建立表tb,設定pk
為主鍵列,並在WITH
條件中指定萬用字元列c2*
和c3*
,類型分別為BIGINT和VARCHAR。
CREATE TABLE tb(pk integer, c1 varchar, `c2*` bigint, `c3*` varchar, primary key(pk)) WITH(wildcard_column='c2*,c3*');
根據表tb的建立規則,列名以c2開頭(如c2、c21、c22)且資料類型為BIGINT的列,都可以被寫入表tb中;資料類型為非BIGINT但符合匹配規則的列,則會被轉化為BIGINT類型寫入。列名以c3開頭(如c32、c33、c35)且資料類型為VARCHAR的列都可以被寫入表tb中;資料類型為非VARCHAR但符合匹配規則的列,則會被轉化為VARCHAR類型寫入。
搜尋索引
支援為萬用字元列建立搜尋索引。符合萬用字元匹配規則的列,都會被索引至搜尋索引中。
CREATE SEARCH INDEX IF NOT EXISTS sidx ON tb(`c2*`, `c3*`);
DML
寫入
寫入資料時,寫入列的列名需要滿足以下兩點要求:
符合萬用字元列的匹配規則。
資料類型符合萬用字元列的定義類型。
UPSERT INTO tb(pk, c1, c2, c21, c22, c31) values (1, 'a1', 2, 21, 22, 'c3');