国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Postgresql關于JSON、JSONB的操作符、處理函數(持續(xù)更新)

這篇具有很好參考價值的文章主要介紹了Postgresql關于JSON、JSONB的操作符、處理函數(持續(xù)更新)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、postgresql實用函數

(只列舉本次用到的函數,其他函數在文章后面有詳解)

1.1、將jsonb格式的數組中的值展開/分解成單獨的數據/對象?

Postgresql關于JSON、JSONB的操作符、處理函數(持續(xù)更新)

SELECT answer_id,? jsonb_array_elements(option_ids)::INTEGER? AS option_id

FROM db_live_answer?

WHERE survey_code='No.20230605165428002'

?Postgresql關于JSON、JSONB的操作符、處理函數(持續(xù)更新)

?

1.2、如何根據對象id將jsonb數組展開到每個jsonb列的對象中?

Postgresql關于JSON、JSONB的操作符、處理函數(持續(xù)更新)

?如果所有json數組都包含兩個新列的兩個元素,那么使用固定路徑,如dmfay的答案。 否則,你應該使用jsonb_array_elements()兩次取消數組,分別為text_id_onetext_id_two

update sample t set
    text_id_one = value1,
    text_id_two = value2
from sample s, 
    jsonb_array_elements(s.metadata_array) as e1(value1),
    jsonb_array_elements(s.metadata_array) as e2(value2)
where s.id = t.id
    and value1->>'id' = 'textIdOne'
    and value2->>'id' = 'textIdTwo'
returning t.*

如果數組中有兩個以上的元素,則此變體可能更高效(也更方便):

update sample t
set 
    text_id_one = arr1->0,
    text_id_two = arr2->0
from (
    select 
        id,
        jsonb_agg(value) filter (where value->>'id' = 'textIdOne') as arr1,
        jsonb_agg(value) filter (where value->>'id' = 'textIdTwo') as arr2
    from sample,
    jsonb_array_elements(metadata_array)
    group by id
    ) s
where t.id = s.id
returning t.*

例子來源:如何根據對象id將jsonb數組展開到每個jsonb列的對象中?

2、postgresql操作符的使用

一、 -> 和 ->>? (適用于操作數組) :

-> 表示獲取一個JSON數組元素,支持下標值(下標從0開始)、Key獲取。

->> 表示獲取一個JSON對象字符串。

代碼:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON -> 1;
結果:
{"b":2}
以上,::JSON 表示聲明前面的字符串為一個JSON字符串對象,而且PostgreSQL中的JSON、JSONB對象 Key的聲明必須是字符串 。同時,1表示獲取JSON數組中下標值為1的JSON對象。

接下來,看下 ->> 的用法:

代碼:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1;
結果:
{"b":2}
以上,->> 的查詢結果和 -> 對比不太直觀,我們可以進一步驗證。

連用:

代碼:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON -> 1 -> 'b';
結果:
2
以上,我們可以看到首先我們使用下標的方式,獲取JSON數組中下標值為1的JSON對象 {"b":2}。然后,我們通過Key的方式來獲取這個JSON對象的Value值,結果是 2。

接下來,我們測試下 ->> 的方式來獲取:

代碼:
SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1 -> 'b';
?
報錯:
[SQL]SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1 -> 'b';
?
[Err] 錯誤: ?操作符不存在: text -> unknown
LINE 1: SELECT '[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1 -> 'b';
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?^
HINT: ?No operator matches the given name and argument types. You might need to add explicit type casts.
以上,可以看到錯誤提示操作符不存在,因為第一步查詢出來的是一個字符串,不是JSON對象。

改成正確提取方式:

代碼:
SELECT ('[{"a":1},{"b":2},{"c":3}]'::JSON ->> 1)::JSON -> 'b';
結果:
2
以上,可以看到現(xiàn)在可以正確查詢出結果,我們將第一步查詢出來的字符串轉成JSON對象,然后通過 Key 的方式來獲取 Value。不過,這種查詢方式相對于 -> 來說還是比較繁瑣的。

二、 #> 和 #>>?(適用于操作對象)

在前一步,我們在一個JSON數組中可以使用 -> 下標值的方式來獲取一個JSON對象。但是,如果我們我們檢索的不是JSON數組,而是一個JSON對象中的JSON對象。很顯然,這種下標獲取的方式不再適用。不過,我們可以使用下面的方式來獲取。

#> 表示獲取指定路徑的一個JSON對象,

#>>表示獲取指定路徑的一個JSON對象的字符串。

代碼:
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON #> ''
結果:
{"ba":"b1","bb":"b2"}
以上,我們使用 #> 方式來獲取一個JSON對象中的JSON對象。

注意:

在獲取一個JSON對象時,除非是JSON數組中的下標,必須要要用 { } 將JSON對象的 Key 包裹起來,否則會拋出異常。

代碼:
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON#>'b'
結果:
[Err] 錯誤: ?有缺陷的數組常量:"b"
LINE 1: SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON#>'b'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ^
DETAIL: ?數組值必須以 "{" 或者維度信息開始。

同樣的,我們還可以在 #> 的基礎上,繼續(xù)獲取這個JSON對象內的相關信息。

代碼:
SELECT '{"a":1,"b":{"ba":"b1","bb":"b2"},"c":3}'::JSON#>''->'ba'
結果:
"b1"
??????以上,可以看到 -> 獲取的是一個JSON對象。->>是獲取的一個text 文本


二、PostgreSQL 操作符、函數

json和jsonb 操作符

操作符 右操作數類型 描述 例子 例子結果
-> int 獲得 JSON 數組元素(索引從 0 開始,負整數從末尾開始計) [{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 {"c":"baz"}
-> text 通過鍵獲得 JSON 對象域 {"a": {"b":"foo"}}'::json->'a' {"b":"foo"}
->> int 以text形式獲得 JSON 數組元素 [1,2,3]'::json->>2 3
->> text 以text形式獲得 JSON 對象域 {"a":1,"b":2}'::json->>'b' 2
#> text[] 獲取在指定路徑的 JSON 對象 {"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' {"c": "foo"}
#>> text[] 以text形式獲取在指定路徑的 JSON 對象 {"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' 3

額外的jsonb操作符

操作符 右操作數類型 描述 例子
@> jsonb 左邊的 JSON 值是否在頂層包含右邊的 JSON 路徑/值項? {"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb
<@ jsonb 左邊的 JSON 路徑/值項是否被包含在右邊的 JSON 值的頂層? {"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb
? text 鍵/元素字符串是否存在于 JSON 值的頂層? {"a":1, "b":2}'::jsonb ? 'b'
?| text[] 這些數組字符串中的任何一個是否做為頂層鍵存在? {"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'c']
?& text[] 是否所有這些數組字符串都作為頂層鍵存在? ["a", "b"]'::jsonb ?& array['a', 'b']
|| jsonb 把兩個jsonb值串接成一個新的jsonb值 ["a", "b"]'::jsonb || '["c", "d"]'::jsonb
- text 從左操作數刪除鍵/值對或者string 元素。鍵/值對基于它們的鍵值來匹配。 {"a": "b"}'::jsonb - 'a'
- text[] 從左操作數中刪除多個鍵/值對或者string元素。鍵/值對基于它們的鍵值來匹配。 {"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[]
- integer 刪除具有指定索引(負值表示倒數)的數組元素。如果 頂層容器不是數組則拋出一個錯誤。 ["a", "b"]'::jsonb - 1
#- text[] 刪除具有指定路徑的域或者元素(對于 JSON 數組,負值 表示倒數) ["a", {"b":1}]'::jsonb #- '{1,b}'

JSON 創(chuàng)建函數

函數 描述 例子 例子結果
to_json(anyelement)? to_jsonb(anyelement) ??? 把該值返回為json或者jsonb。數組和組合 會被(遞歸)轉換成數組和對象;對于不是數組和組合的值,如果有 從該類型到json的造型,造型函數將被用來執(zhí)行該 轉換;否則將產生一個標量值。對于任何不是數字、布爾、空值的標 量類型,將使用文本表達,在這種風格下它是一個合法的 json或者jsonb值。 to_json('Fred said "Hi."'::text) Fred said \Hi.\""
array_to_json(anyarray [, pretty_bool]) ??? 把數組作為一個 JSON 數組返回。一個 PostgreSQL 多維數組會成為一個數組 的 JSON 數組。如果pretty_bool為真,將在 第 1 維度的元素之間增加換行。 array_to_json('{{1,5},{99,100}}'::int[]) [[1,5],[99,100]]
row_to_json(record [, pretty_bool]) ??? 把行作為一個 JSON 對象返回。如果pretty_bool為真,將在第1層元素之間增加換行。 row_to_json(row(1,'foo')) {"f1":1,"f2":"foo"}
json_build_array(VARIADIC "any")?? jsonb_build_array(VARIADIC "any") ??? 從一個可變參數列表構造一個可能包含異質類型的 JSON 數組。 json_build_array(1,2,'3',4,5) [1, 2, "3", 4, 5]
json_build_object(VARIADIC "any")?? jsonb_build_object(VARIADIC "any") ??? 從一個可變參數列表構造一個 JSON 對象。通過轉換,該參數列表由交替 出現(xiàn)的鍵和值構成。 json_build_object('foo',1,'bar',2) {"foo": 1, "bar": 2}
json_object(text[])? jsonb_object(text[]) ??? 從一個文本數組構造一個 JSON 對象。該數組必須可以是具有偶數個成員的 一維數組(成員被當做交替出現(xiàn)的鍵/值對),或者是一個二維數組(每一個 內部數組剛好有 2 個元素,可以被看做是鍵/值對)。 json_object('{a, 1, b, "def", c, 3.5}')? json_object('{{a, 1},{b, "def"},{c, 3.5}}') ??? {"a": "1", "b": "def", "c": "3.5"}

json_object(keys text[], values text[])?

jsonb_object(keys text[], values text[])

?json_object的這種形式從兩個獨立的數組得到鍵/值對。在其 他方面和一個參數的形式相同。 json_object('{a, b}', '{1,2}') {"a": "1", "b": "2"}

JSON 處理?

函數 返回值 描述 例子 例子結果
json_array_length(json)? jsonb_array_length(jsonb) int 返回最外層 JSON 數組中的元素數量。 json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]') 5
json_each(json)?
jsonb_each(jsonb)
setof key text, value json
setof key text, value jsonb
擴展最外層的 JSON 對象成為一組鍵/值對。 select * from json_each('{"a":"foo", "b":"bar"}') ?key | value
-----+-------
?a?? | "foo"
?b?? | "bar"
json_each_text(json)? jsonb_each_text(jsonb) setof key text, value text 擴展最外層的 JSON 對象成為一組鍵/值對。返回值將是text類型。 select * from json_each_text('{"a":"foo", "b":"bar"}') ?key | value
-----+-------
?a?? | foo
?b?? | bar
json_extract_path(from_json json, VARIADIC path_elems text[])?? jsonb_extract_path(from_json jsonb, VARIADIC path_elems text[]) json
jsonb
返回由path_elems指向的 JSON 值(等效于#>操作符)。 json_extract_path('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4') {"f5":99,"f6":"foo"}
json_extract_path_text(from_json json, VARIADIC path_elems text[])? jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[])? text 以text返回由path_elems指向的 JSON 值(等效于#>>操作符)。 json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','f4', 'f6') foo
json_object_keys(json)? jsonb_object_keys(jsonb) setof text 返回最外層 JSON 對象中的鍵集合。 json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}') json_object_keys
------------------
?f1
?f2
json_populate_record(base anyelement, from_json json)? jsonb_populate_record(base anyelement, from_json jsonb) anyelement 擴展from_json中的對象成一個行,它的列匹配由base定義的記錄類型(見下文的注釋)。 select * from json_populate_record(null::myrowtype, '{"a": 1, "b": ["2", "a b"], "c": {"d": 4, "e": "a b c"}}') ?a |?? b?????? |????? c
---+-----------+-------------
?1 | {2,"a b"} | (4,"a b c")
json_populate_recordset(base anyelement, from_json json)? jsonb_populate_recordset(base anyelement, from_json jsonb) setof anyelement 擴展from_json中最外的對象數組為一個集合,該集合的列匹配由base定義的記錄類型。 select * from json_populate_recordset(null::myrowtype, '[{"a":1,"b":2},{"a":3,"b":4}]') ?a | b
---+---
?1 | 2
?3 | 4
json_array_elements(json)? jsonb_array_elements(jsonb) setof json
setof jsonb
把一個 JSON 數組擴展成一個 JSON 值的集合。 select * from json_array_elements('[1,true, [2,false]]') value
-----------
?1
?true
?[2,false]
json_array_elements_text(json)? jsonb_array_elements_text(jsonb) setof text 把一個 JSON 數組擴展成一個text值集合。 select * from json_array_elements_text('["foo", "bar"]') ? value
-----------
?foo
?bar
json_typeof(json)? jsonb_typeof(jsonb) text 把最外層的 JSON 值的類型作為一個文本字符串返回??赡艿念愋褪牵?object、array、string、number、 boolean以及null。 json_typeof('-123.4') number
json_to_record(json)? jsonb_to_record(jsonb) record 從一個 JSON 對象(見下文的注解)構建一個任意的記錄。正如所有返回record 的函數一樣,調用者必須用一個AS子句顯式地定義記錄的結構。 select * from json_to_record('{"a":1,"b":[1,2,3],"c":[1,2,3],"e":"bar","r": {"a": 123, "b": "a b c"}}') as x(a int, b text, c int[], d text, r myrowtype) ?a |??? b??? |??? c??? | d |?????? r
---+---------+---------+---+---------------
?1 | [1,2,3] | {1,2,3} |?? | (123,"a b c")
json_to_recordset(json)? jsonb_to_recordset(jsonb) setof record 從一個 JSON 對象數組(見下文的注解)構建一個任意的記錄集合。正如所有返回record 的函數一樣,調用者必須用一個AS子句顯式地定義記錄的結構。 select * from json_to_recordset('[{"a":1,"b":"foo"},{"a":"2","c":"bar"}]') as x(a int, b text); ?a |? b
---+-----
?1 | foo
?2 |
json_strip_nulls(from_json json)? jsonb_strip_nulls(from_json jsonb) json
jsonb
返回from_json,其中所有具有空值的 對象域都被省略。其他空值不動。 json_strip_nulls('[{"f1":1,"f2":null},2,null,3]') [{"f1":1},2,null,3]
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) jsonb 返回target,其中由 path指定的節(jié)用 new_value替換,如果 path指定的項不存在并且 create_missing為真(默認為 true)則加上 new_value。正如面向路徑的 操作符一樣,出現(xiàn)在path中的 負整數表示從 JSON 數組的末尾開始數。 jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false) jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}','[2,3,4]') [{"f1":[2,3,4],"f2":null},2,null,3][{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]
jsonb_insert(target jsonb, path text[], new_value jsonb, [insert_after boolean]) jsonb 返回被插入了new_value的target。如果path指定的target節(jié)在一個 JSONB 數組中,new_value將被插入到目標之前(insert_after為false,默認情況)或者之后(insert_after為真)。如果path指定的target節(jié)在一個 JSONB 對象內,則只有當target不存在時才插入new_value。對于面向路徑的操作符來說,出現(xiàn)在path中的負整數表示從 JSON 數組的末尾開始計數。 jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"')? jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true) {"a": [0, "new_value", 1, 2]}? {"a": [0, 1, "new_value", 2]}
jsonb_pretty(from_json jsonb) text 把from_json返回成一段 縮進后的 JSON 文本。 jsonb_pretty('[{"f1":1,"f2":null},2,null,3]') [
??? {
??????? "f1": 1,
??????? "f2": null
??? },
??? 2,
??? null,
??? 3
]

?參考:PostgreSQL中JSON函數和操作符_function jsonb_set(json, unknown, unknown) does no_EngineerForSoul的博客-CSDN博客

postgresql 關于JSON、JSONB操作符以處理函數_postgresql json函數_谷滿滿的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-477774.html

到了這里,關于Postgresql關于JSON、JSONB的操作符、處理函數(持續(xù)更新)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • PostgreSQL 查詢json/jsonb是否存在某個片段

    在PostgreSQL中,jsonb有額外的操作符,如 @、@、?、?|、? 可以用來查詢是否包含路徑/值,以及頂層鍵值是否存在。 詳細文章:PostgreSQL 操作json/jsonb 那么,如果我們不知道路徑,只想要查詢json/jsonb是否存在某個片段,那就跟我一起來學習吧! 思路:使用 ::text 將json/jsonb轉換成為

    2024年02月15日
    瀏覽(15)
  • 【C語言初階】帶你輕松玩轉所有常用操作符(1) ——算數操作符,移位操作符,位操作符

    【C語言初階】帶你輕松玩轉所有常用操作符(1) ——算數操作符,移位操作符,位操作符

    君兮_的個人主頁 勤時當勉勵 歲月不待人 C/C++ 游戲開發(fā) Hello,這里是君兮_,最近要準備期末復習了,可能更新的就不會那么頻繁了,下個星期恢復正常更新。 今天給大家?guī)淼氖遣僮鞣斀?,由于這部分的內容比較多,可能會分成幾部分講,今天帶來的是第一部分的內容,廢

    2024年02月11日
    瀏覽(32)
  • 初始C語言——詳細講解操作符以及操作符的易錯點

    初始C語言——詳細講解操作符以及操作符的易錯點

    ?第一章?“C“滸傳——初識C語言(更適合初學者體質哦!) ?第二章?詳細認識分支語句和循環(huán)語句以及他們的易錯點? ?第三章?初階C語言——特別詳細地介紹函數 ?第四章?初始C語言——詳細地講解數組的內容以及易錯點 ?第五章? 初始C語言——詳細講解操作符以及操

    2024年02月13日
    瀏覽(36)
  • 【c語言操作符系列1】^(異或操作符)講解和多種例題詳解

    【c語言操作符系列1】^(異或操作符)講解和多種例題詳解

    目錄 一、^ 是什么(^稱為異或) 二、^的規(guī)律(特點) 三、可利用^秒殺的常見例題(重點) 1、消失的數字 ?2、不一樣的人生密碼 3、交換兩個數(不能創(chuàng)建中間變量) 4、找出只出現(xiàn)一個的兩個數字 是一種操作符, 針對二進制異或而言的 ,兩個數對應的二進制位相同,異或

    2024年02月16日
    瀏覽(27)
  • Js中.?和??語法(可選鏈操作符和雙問號操作符)

    Js中.?和??語法(可選鏈操作符和雙問號操作符)

    Tips:為啥起這么一個標題呢,因為我自己當時看代碼,看到這個語法的時候就感覺有些遺忘,但是又不知道他叫做什么名字,所以只能直接搜索.?和??這樣搜索,哈哈哈相信不少人可能跟我一樣,不知道他叫做什么名字嘿嘿。 可選鏈 操作符( ?. )允許讀取位于連接對象鏈深

    2024年01月21日
    瀏覽(27)
  • 【C語言】中的位操作符和移位操作符,原碼反碼補碼以及進制之間的轉換

    【C語言】中的位操作符和移位操作符,原碼反碼補碼以及進制之間的轉換

    歡迎大家來到c語言知識小課堂,今天的知識點是操作符和進制 同樣都是數字1111,不同進制下數字的大小不同,第二行代表的是其各位數字十進制下的大小,將各位數字的十進制大小相加即1111在這個進制下轉化為十進制的大小,從圖中我們可以看出來 進制的定義:從右往左

    2024年02月22日
    瀏覽(24)
  • 前端JS實用操作符,一些騷操作?

    前端JS實用操作符,一些騷操作?

    ???????? 目錄 0、!!? 雙重邏輯非操作符???? 1、?? 操作符 空值合并/空判斷??? 2、?. 可選鏈運算符?? 3、??= 操作符 邏輯空值賦值運算符??? 4、三元運算符??? 5、~~ 操作符 雙位運算符??? 6、與 ||或 短路運算符??? 7、| 0 取整??? 8、 1 判斷奇偶數??? 9、_ 數值分割

    2024年02月14日
    瀏覽(26)
  • ES6...擴展操作符騷操作

    復制和合并數組變得更為簡潔。不需要使用 concat() 方法或 slice() 方法,一個 … 操作符已經足夠: 將數組作為一個需要單獨一個個傳入參數的函數的參數 對象屬性展開復制 如果存在相同的值 后者覆蓋前者 合并對象 類似于object.assign 不過,擴展屬性并不總能生成與 Object.as

    2024年02月14日
    瀏覽(18)
  • JavaScript 操作符

    在 JavaScript 中,有一些操作符可以使代碼更簡潔、易讀和高效。以下是一些常見的操作符: ?. 是 可選鏈操作符(optional chaining operator) 。 ?. 可選鏈操作符 用于訪問可能為空或未定義的屬性或方法,它允許我們安全地訪問嵌套對象的屬性,如果中間的屬性為空或未定義,則不

    2023年04月19日
    瀏覽(24)
  • 【C】操作符詳解

    【C】操作符詳解

    今天給大家?guī)硪黄P于C語言操作符的詳細介紹,在C語言中操作符主要有以下幾種: 1.算術操作符 2.移位操作符 3.位操作符 4.賦值操作符 5.單目操作符 6.關系操作符 7.邏輯操作符 8.逗號表達式 9.條件操作符 9.下標引用,函數調用和結構成員 接下來給大家詳細介紹! + - * /

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包