![](/img/trans.png)
[英]casting back to a type when calling a function on a query result (in 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 中有兩種數據類型, json
和jsonb
...
有關的:
轉換為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.