簡體   English   中英

在 Postgres 中強制轉換為嵌套類型

[英]Casting to a nested type in Postgres

是否可以使用正常cast語法將值轉換為 Array 或 Struct? 例如,類似於我可以這樣做:

SELECT 
    '1'::INT, CAST('1' AS INT)
    CAST('1' AS INT)

我能做類似的事情嗎:

SELECT '[1,2,3]'::ARAY

或者:

SELECT '{"x":1}'::RECORD

要將某些內容轉換為嵌套的 - 而不是預先指定的先前創建的自定義TYPE

作為比較示例,這里使用 BigQuery:

select 
  CAST(([1,2,3],[4,5,6]) AS STRUCT<ARRAY<INT64>, ARRAY<INT64>>) AS a, 
  CAST([1,2,3] AS ARRAY<INT64>) AS b

在此處輸入圖像描述

Postgres 中沒有“STRUCT”。

要轉換為數組,請將類型化元素值傳遞給ARRAY 構造函數(或使用默認元素類型):

SELECT ARRAY[1,2,3];            --> type int[]
SELECT ARRAY[[1,2,3],[4,5,6]];  --> type int[]

數組類型可以包含任意數量的嵌套維度,它在 Postgres 的外部仍然是相同的類型

或者將數組文字轉換為特定的數組類型:

SELECT '{1,2,3}'::int[];            --> type int[]
SELECT '{{1,2,3},{4,5,6}}'::int[];  --> type int[]

要形成任意“記錄”,即匿名ROW 類型,也稱為“復合類型”,請使用ROW 構造函數

SELECT ROW('x', 1);  --> anonymous row type

(在大多數情況下,關鍵字ROW是可選的。)

但是命名(注冊)復合類型(ROW 類型)在大多數情況下更有用,因為 Postgres 知道如何正確地分解它:

SELECT ('x', 1)::my_registered_row_type;  --> well-known row type

同一數據庫中的每個表、視圖或實體化視圖都隱式注冊了一個行類型。 或者顯式地創建一個復合類型

您顯示為“記錄”的內容看起來像 JSON 值。 Postgres 中有兩種數據類型, jsonjsonb ...

有關的:

轉換為ARRAY

SELECT '{1,2,3}'::int[];
 int4   
---------
 {1,2,3}

要創建動態記錄:

select * from  json_each('{"x": 1}'::json);
 key | value 
-----+-------
 x   | 1

命名它:

select * from  json_to_record('{"x": 1}'::json) as t(x int);
 x 
---
 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM