postgresql----數(shù)組類型和函數(shù)

https://www.cnblogs.com/alianbog/p/5665411.html

postgresql支持?jǐn)?shù)組類型,可以是基本類型,也可以是用戶自定義的類型糊余。日常中使用數(shù)組類型的機(jī)會(huì)不多故痊,但還是可以了解一下豫缨。不像C或JAVA高級(jí)語(yǔ)言的數(shù)組下標(biāo)從0開(kāi)始,postgresql數(shù)組下標(biāo)從1開(kāi)始摔桦,既可以指定長(zhǎng)度社付,也可以不指定長(zhǎng)度。且postgresql既支持一維數(shù)組邻耕,也支持多維數(shù)組鸥咖,但是平時(shí)二維數(shù)組也就夠用了。

示例1.使用ARRAY構(gòu)建數(shù)組類型

---1*4的一維數(shù)組test=#selectarray[1,2,3,4];

? array? -----------{1,2,3,4}

(1 row)--2*2的二維數(shù)組test=#selectarray[[1,2],[3,4]];

? ? array? ? ---------------{{1,2},{3,4}}

(1 row)--1*2的二維數(shù)組兄世,基本類型為box矩形類型啼辣,且和上面相比box類型元素之間是以分號(hào)分隔的,其他所有類型的數(shù)據(jù)都是以逗號(hào)分隔的test=#selectarray[box'(1,1),(0,0)',box'(0,0),(-1,-1)'];

? ? ? ? ? ? array? ? ? ? ? ? -----------------------------{(1,1),(0,0);(0,0),(-1,-1)}

(1row)


示例2.創(chuàng)建一張表御滩,字段包含數(shù)組類型

其中int[]表示數(shù)組長(zhǎng)度無(wú)限制鸥拧,int[4]表示數(shù)組長(zhǎng)度為4.

test=#createtabletbl_array(aint[],bvarchar(32)[][],cint);CREATETABLEtest=#insertintotbl_array (a,b,c)values(array[1,2],array[[1,2,3],[4,5,6]],1);INSERT01test=#insertintotbl_array (a,b,c)values(array[1,2,3],array[[1,2],[4,5]],2);INSERT01test=#select*from tbl_array ;

? ? a? ? |b| c ---------+-------------------+---{1,2}|{{1,2,3},{4,5,6}}|1 {1,2,3}|{{1,2},{4,5}}|2(2 rows)

test=#selecta[1],b[2]fromtbl_arraywherec=1;

a | b ---+---1|

(1 row)

test=#selecta[1],b[2][1]fromtbl_arraywherec=1;

a | b ---+---1|4(1 row)

test=#selecta[1],b[2][4]fromtbl_arraywherec=1;

a | b ---+---1|

(1row)


test=#updatetbl_arrayseta[1]=200wherea[1]=1;UPDATE1test=#selecta[1],b[2][4]from tbl_array ;

? a? | b -----+---100|200|

(2rows)


也可以使用[下標(biāo):上標(biāo)]方式來(lái)查詢數(shù)組連續(xù)的某些元素党远。

test=#selecta[2:3]from tbl_array ;

? a? -------{2}

{2,3}

(2 rows)

test=#selecta[1:3]from tbl_array ;

? ? a? ? -----------{100,2}

{200,2,3}

(2rows)



數(shù)組操作符與函數(shù)

操作符

操作符描述示例結(jié)果

=相等?SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3];?t

<>不等于?select ARRAY[1,2,3] <> ARRAY[1,2,4];?t

<小于?select ARRAY[1,2,3] < ARRAY[1,2,4];?t

>大于?select ARRAY[1,4,3] > ARRAY[1,2,4];?t

<=小于或等于?select ARRAY[1,2,3] <= ARRAY[1,2,3];?t

>=大于或等于?select ARRAY[1,4,3] >= ARRAY[1,4,3];?t

@>包含?select ARRAY[1,4,3] @> ARRAY[3,1];?t

<@包含于?select ARRAY[2,7] <@ ARRAY[1,7,4,2,6];?t

&&重疊(是否有相同元素)?select ARRAY[1,4,3] && ARRAY[2,1];?t

||數(shù)組與數(shù)組連接?select ARRAY[1,2,3] || ARRAY[4,5,6];?{1,2,3,4,5,6}

||數(shù)組與數(shù)組連接?select ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]];?{{1,2,3},{4,5,6},{7,8,9}}

||元素與數(shù)組連接?select 3 || ARRAY[4,5,6];?{3,4,5,6}

||數(shù)組與元素連接?select ARRAY[4,5,6] || 7;?{4,5,6,7}


函數(shù)

函數(shù)返回類型描述示例結(jié)果

array_append(anyarray,anyelement)anyarray?在數(shù)組末尾追加元素?

SELECT array_append(ARRAY[1,2], 3);

?{1,2,3}

array_cat(anyarray,anyarray)anyarray?連接兩個(gè)數(shù)組?SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]);?{1,2,3,4,5}

array_ndims(anyarray)int?返回?cái)?shù)組維數(shù)?SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]);?2

array_dims(anyarray)text?返回?cái)?shù)組維數(shù)的文本表示?SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]);?[1:2][1:3]

array_fill(anyelement,int[], [,int[]])anyarray使用提供的值和維度初始化一個(gè)數(shù)組,其中anyelement是值富弦,第一個(gè)int[]是數(shù)組的長(zhǎng)度沟娱,第二個(gè)int[]是數(shù)組下界,下界默認(rèn)是1?SELECT array_fill(7, ARRAY[3], ARRAY[2]);?[2:4]={7,7,7}

array_length(anyarray,int)int?返回?cái)?shù)組指定維度的長(zhǎng)度?SELECT array_length(array[1,2,3], 1);?3

array_lower(anyarray,int)int?返回?cái)?shù)組指定維度的下界?SELECT array_lower('[0:2]={1,2,3}'::int[], 1);?0

array_position(anyarray,anyelement[,int])int?返回?cái)?shù)組元素anyelement從數(shù)組的[,int]位置(默認(rèn)為1)開(kāi)始第一次出現(xiàn)在數(shù)組中的位置腕柜,數(shù)組必須是一維的?SELECT array_position(ARRAY['sun','mon','tue','wed','thu','fri','sat'], 'mon');?2

array_positions(anyarray,anyelement)int[]?返回元素在數(shù)組中的所有位置?SELECT array_positions(ARRAY['A','A','B','A'], 'A');?{1,2,4}

array_prepend(anyelement,anyarray)anyarray?在數(shù)組開(kāi)頭添加新的元素?SELECT array_prepend(1, ARRAY[2,3]);?{1,2,3}

array_remove(anyarray,anyelement)anyarray?從數(shù)組中刪除所有的指定元素济似,必須是一維數(shù)組?SELECT array_remove(ARRAY[1,2,3,2], 2);?{1,3}

array_replace(anyarray,anyelement,anyelement)anyarray?替換指定數(shù)組元素為新的元素?SELECT array_replace(ARRAY[1,2,5,4], 5, 3);?{1,2,3,4}

array_to_string(anyarray,text[,text])text?將數(shù)組元素使用分隔符連接為文本,NULL可以使用指定元素替換?SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*');?1,2,3,*,5

array_upper(anyarray,int)int?數(shù)組指定維度的上屆?SELECT array_upper(ARRAY[1,8,3,7], 1);?4

cardinality(anyarray)int?返回?cái)?shù)組所有維度的長(zhǎng)度總和盏缤,如果是空數(shù)組則返回0?SELECT cardinality(ARRAY[[1,2],[3,4]]);?4

string_to_array(text,text[,text])text[]?將文本使用分隔符分隔后轉(zhuǎn)換為數(shù)組砰蠢,如果指定第三個(gè)參數(shù),則第三個(gè)參數(shù)在數(shù)組中被轉(zhuǎn)換為NULL?SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy');?{xx,NULL,zz}

unnest(anyarray)setof anyelement?將數(shù)組元素轉(zhuǎn)換為行?SELECT unnest(ARRAY[1,2]);?

1

2

unnest(anyarray,anyarray[, ...])setof anyelement, anyelement [, ...]?將多維數(shù)組轉(zhuǎn)換為行集合唉铜,其中第一個(gè)數(shù)組顯示為第一列娩脾,第二個(gè)數(shù)組顯示為第二列,以此類推打毛。但是這個(gè)函數(shù)只在from子句中使用?SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);?

unnest | unnest

--------+----

1 | foo

2 | bar

? | baz

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柿赊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幻枉,更是在濱河造成了極大的恐慌碰声,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬甫,死亡現(xiàn)場(chǎng)離奇詭異胰挑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)椿肩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門瞻颂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人郑象,你說(shuō)我怎么就攤上這事贡这。” “怎么了厂榛?”我有些...
    開(kāi)封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵盖矫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我击奶,道長(zhǎng)辈双,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任柜砾,我火速辦了婚禮湃望,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己证芭,他們只是感情好瞳浦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著檩帐,像睡著了一般术幔。 火紅的嫁衣襯著肌膚如雪另萤。 梳的紋絲不亂的頭發(fā)上湃密,一...
    開(kāi)封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音四敞,去河邊找鬼泛源。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忿危,可吹牛的內(nèi)容都是我干的达箍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铺厨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缎玫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起解滓,我...
    開(kāi)封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赃磨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后洼裤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體邻辉,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年腮鞍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了值骇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡移国,死狀恐怖吱瘩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迹缀,我是刑警寧澤搅裙,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站裹芝,受9級(jí)特大地震影響部逮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嫂易,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一兄朋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦颅和、人聲如沸傅事。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹭越。三九已至,卻和暖如春教届,著一層夾襖步出監(jiān)牢的瞬間响鹃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工案训, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留买置,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓强霎,卻偏偏與公主長(zhǎng)得像忿项,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子城舞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容