我在雪花列中有這個字串:
\[
{
"entryListId": 3279,
"id": 4617,
"name": "SpecTra",
"type": 0
},
{
"entryListId": 3279,
"id": 7455,
"name": "Signal Capital Partners",
"type": 0
}
\]
無論公司名稱有多少,我都需要以這種格式獲取名稱:“SpecTra,Signal Capital Partners”。換句話說,我需要提取公司名稱并將它們連接起來。
我試過這個:
regexp_replace(col, '"(\[^"\] )"|.', '\\1|')
和 regexp_substr()函式,但沒有得到所需的輸出
你能幫我解決這個問題嗎?謝謝
uj5u.com熱心網友回復:
您可以使用
trim(regexp_replace(regexp_replace(col, '"name":\\s*"([^"] )"|.', '\\1,'), ', ', ','), ',')
詳情:
"name":\s*"([^"] )"|.正則運算式匹配"name":, 然后是零個或多個空格和 a , 然后將除然后匹配一個字符之外的"任何一個或多個字符捕獲到組 1中, 并替換為組 1 和逗號""- 第二個將
regexp_replace所有逗號縮小為一個逗號,匹配一個或多個逗號(您也可以在此處,使用更具體的模式),{2,} trim從開頭和結尾洗掉逗號。
uj5u.com熱心網友回復:
因此,將您的文本 blob 推入 CTE。
with data as (
SELECT * FROM VALUES
('[{"entryListId": 3279,"id": 4617,"name": "SpecTra","type": 0},{"entryListId": 3279,"id": 7455,"name": "Signal Capital Partners","type": 0}]')
t(str)
)
我不禁注意到它是 JSON,所以讓PARSE_JSON那然后FLATTEN它,這里是你的“名字”
select
d.*
,f.value:name::text as name
from data d
,table(flatten(input=>parse_json(d.str))) f
給予:
| STR | 姓名 |
|---|---|
| [{"entryListId": 3279,"id": 4617,"name": "SpecTra","type": 0},{"entryListId": 3279,"id": 7455,"name": "Signal Capital Partners ","型別": 0}] | 光譜儀 |
| [{"entryListId": 3279,"id": 4617,"name": "SpecTra","type": 0},{"entryListId": 3279,"id": 7455,"name": "Signal Capital Partners ","型別": 0}] | 信號資本合伙??人 |
從而聚合,使用LISTAGG
select
listagg(f.value:name::text, ',') as names
from data d
,table(flatten(input=>parse_json(d.str))) f
給出:
| 名稱 |
|---|
| SpecTra,信號資本合作伙伴 |
重復資料:
您可以將 DISTINCT 添加到 LISTAGG 并只保留不同的值,但考慮到這是成本,我確實指出了這一點,并且您沒有提到重復資料。
with data as (
SELECT * FROM VALUES
('[
{
"entryListId": 3279,
"id": 4617,
"name": "SpecTra",
"type": 0
},
{
"entryListId": 3279,
"id": 4617,
"name": "SpecTra",
"type": 0
},
{
"entryListId": 3279,
"id": 7455,
"name": "Signal Capital Partners",
"type": 0
}]')
t(str)
)
select
listagg(distinct f.value:name::text, ',') as names
from data d
,table(flatten(input=>parse_json(d.str))) f;
給出:
| 名稱 |
|---|
| SpecTra,信號資本合作伙伴 |
哪里-因為該正則運算式解決方案不處理這種情況:
with data as (
SELECT * FROM VALUES
('[
{
"entryListId": 3279,
"id": 4617,
"name": "SpecTra",
"type": 0
},
{
"entryListId": 3279,
"id": 4617,
"name": "SpecTra",
"type": 0
},
{
"entryListId": 3279,
"id": 7455,
"name": "Signal Capital Partners",
"type": 0
}]')
t(str)
)
select
trim(regexp_replace(regexp_replace(d.str, '"name":\\s*"([^"] )"|.', '\\1,'), ', ', ','), ',') as regexp_replace
from data d
給出:
| 正則運算式_REPLACE |
|---|
| , , , SpecTra, , , , , , SpecTra, , , , , , Signal Capital Partners, , |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457104.html
上一篇:洗掉十進制格式中的多余字串字符
