postgresql 將逗號分隔的字符串轉為多行的實例
-- 將逗號分隔的字符串轉為多行
SELECT unnest(string_to_array('4513,4564,555',',')) as a1;
-- array轉為行
SELECT unnest(ARRAY[1,2]); SELECT * from unnest(ARRAY[1,2],ARRAY['foo','bar','baz']);
補充:PostgreSQL 行轉列、列轉行字符串函數(shù)、字符串分割函數(shù)
本文主要介紹PostgreSQL 的行轉列、列轉行以及字符串切割函數(shù),實際業(yè)務中對前兩個均有使用,并配有實際例子參考。
1、字符串列轉行
string_agg,某些地方也稱為字符串聚合操作。
如果需要按照一個字符串按照某個分割符拼接起來。
例如:
按照id把字符串按照指定分隔符拼接起來。實際業(yè)務中有什么需要這種字符串函數(shù)的呢?
-----------------------update 2020年1月16日17:05:59-----------------------
這里學習一個和系統(tǒng)表有關的查詢,用到了stragg ,用法之妙,自己體會。
SELECT string_agg(att.attname,',' order by attrnums) as distribution FROM gp_distribution_policy a,pg_attribute att WHERE a.localoid ='sor.wpp_adefect_f_n'::regclass and a.localoid = att.attrelid and att.attnum = any(a.attrnums);
select attname,attnum from pg_attribute where attrelid='26625' order by attnum asc;
可以看到每個表上除了可見的列之外還有attrnums < 1的列。這幾個列用來實現(xiàn)mvcc、表明數(shù)據(jù)的物理位置、數(shù)據(jù)所處segID...
select string_agg(attname,',' order by attnum) from pg_attribute where attrelid='26625' and attnum >0;
將所有可見列查詢出來拼接sql,屢試不爽。
2、字符串行轉列
regexp_split_to_table(string, pattern [, flags ])
regexp_split_to_table(string, pattern [, flags ])。如果沒有與pattern的匹配,該函數(shù)返回string。
如果有至少有一個匹配,對每一個匹配它都返回從上一個匹配的末尾(或者串的開頭)到這次匹配開頭之間的文本。當沒有更多匹配時,它返回從上一次匹配的末尾到串末尾之間的文本。
flags參數(shù)是一個可選的文本串,它包含零個或更多單字母標志,這些標識可以改變該函數(shù)的行為。
這個標識有很多,具體可查看http://postgres.cn/docs/9.6/functions-matching.html。不過該參數(shù)是可以省略的,我看到很少用這個flg的。
E是Posix樣式轉義字符串的前綴。現(xiàn)代Postgres通常不需要這個,此處的E可有可無。
--\\s+ 可匹配至少一個空白字符。
--\\s 表示空白字符。包括,空格,制表符等
--\s*
--*是貪婪模式,會盡可能匹配更多的字符
--而*?是非貪婪模式 會盡量匹配少的字符
SELECT foo FROM regexp_split_to_table('the quick brown fox jumps over the lazy dog', E'\\s') AS foo; SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*?') AS foo;
關于正則表達式計劃以專題來學習
幾個元字符是需要記住的:
-----------------------update 2019年10月23日11:37:32-----------------------
imagePath字符串切割處理
如果想將如上的長列轉換為多行,可通過regexp_split_to_table()來處理。處理的結果如下。
sql形如:
select regexp_split_to_table(image_path,E'\\ ') pattern from (select distinct panel_id, 'Y:\\' || prod_id || '\\' || substring( glass_id, 0, 6 )|| '\\' || substring( glass_id, 0, 9 )|| '\\' || panel_id || '\\' || 'big' || ' '|| 'Y:\\' || prod_id || '\\' || substring( glass_id, 0, 6 )|| '\\' || substring( glass_id, 0, 9 )|| '\\' || panel_id || '\\' || 'small'|| ' '|| 'Y:\\' || prod_id || '\\' || substring( glass_id, 0, 6 )|| '\\' || substring( glass_id, 0, 9 )|| '\\' || panel_id || '\\' || 'IMAGE' as image_path from tabelName where 1 = 1 and time>= '2019-09-09 00:00:00' and time<= '2019-09-10 08:00:00' )A
3、字符串分割符
split_part(str,',',1) select split_part('A3332-22222222','-',1); - > A3332 select split_part('A3332-22222222','-',2); - > 22222222
這個比較簡單一看便知道了。
相關文章
PostgreSQL 查看數(shù)據(jù)庫,索引,表,表空間大小的示例代碼
PostgreSQL 提供了多個系統(tǒng)管理函數(shù)來查看表,索引,表空間及數(shù)據(jù)庫的大小,下面詳細介紹一下2013-08-08PostgreSQL中實現(xiàn)數(shù)據(jù)實時監(jiān)控和預警的步驟詳解
在 PostgreSQL 中實現(xiàn)數(shù)據(jù)的實時監(jiān)控和預警是確保數(shù)據(jù)庫性能和數(shù)據(jù)完整性的關鍵任務,以下將詳細討論如何實現(xiàn)此目標,并提供相應的解決方案和具體示例,需要的朋友可以參考下2024-07-07Linux系統(tǒng)安裝PostgreSQL數(shù)據(jù)庫及配置的詳細過程
這篇文章主要給大家介紹了關于Linux系統(tǒng)安裝PostgreSQL數(shù)據(jù)庫及配置的詳細過程,PgSQL(全稱PostgreSQL)是一個功能強大的開源對象-關系型數(shù)據(jù)庫系統(tǒng),結合了許多安全存儲和擴展最復雜數(shù)據(jù)工作負載的功能,需要的朋友可以參考下2023-12-12PostgreSQL中date_trunc函數(shù)的語法及一些示例
這篇文章主要給大家介紹了關于PostgreSQL中date_trunc函數(shù)的語法及一些示例的相關資料,DATE_TRUNC函數(shù)是PostgreSQL數(shù)據(jù)庫中用于截斷日期部分的函數(shù),文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04Postgresql設置遠程訪問的方法(需要設置防火墻或者關閉防火墻)
這篇文章主要介紹了Postgresql設置遠程訪問的方法(需要設置防火墻或者關閉防火墻),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03Postgresql數(shù)據(jù)庫之創(chuàng)建和修改序列的操作
這篇文章主要介紹了Postgresql數(shù)據(jù)庫之創(chuàng)建和修改序列的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02