map type
map
data expresses an unordered map with text
keys and an
arbitrary uniform value type.
Detail | Info |
---|---|
Quick Syntax | '{a=>123.4, b=>111.1}'::map[text=>double]' |
Size | Variable |
Catalog name | Anonymous, but nameable |
Syntax
Field | Use |
---|---|
map_string | A well-formed map object. |
value_type | The type of the map’s values. |
Map functions + operators
Operators
Operator | RHS Type | Description |
---|---|---|
-> |
string |
Access field by name, and return target field (docs) |
@> |
map |
Does element contain RHS? (docs) |
<@ |
map |
Does RHS contain element? (docs) |
? |
string |
Is RHS a top-level key? (docs) |
?& |
string[] |
Does LHS contain all RHS top-level keys? (docs) |
?| |
string[] |
Does LHS contain any RHS top-level keys? (docs) |
Functions
Function |
---|
Return the number of elements in |
Builds a map from a list of records whose fields are two elements, the
first of which is |
Aggregate keys and values (including nulls) as a map (docs). |
Details
Construction
You can construct maps using the MAP
expression:
SELECT MAP['a' => 1, 'b' => 2];
map
-------------
{a=>1,b=>2}
You can nest MAP
constructors:
SELECT MAP['a' => MAP['b' => 'c']];
map
-------------
{a=>{b=>c}}
You can also elide the MAP
keyword from the interior map expressions:
SELECT MAP['a' => ['b' => 'c']];
map
-------------
{a=>{b=>c}}
MAP
expressions evalute expressions for both keys and values:
SELECT MAP['a' || 'b' => 1 + 2];
map
-------------
{ab=>3}
Alternatively, you can construct a map from the results of a subquery. The
subquery must return two columns: a key column of type text
and a value column
of any type, in that order. Note that, in this form of the MAP
expression,
parentheses are used rather than square brackets.
SELECT MAP(SELECT key, value FROM test0 ORDER BY x DESC LIMIT 3);
map
------------------
{a=>1,b=>2,c=>3}
With all constructors, if the same key appears multiple times, the last value for the key wins.
Note that you can also construct maps using the available text
cast.
Constraints
- Keys must be of type
text
. - Values can be of any type as long as the type is uniform.
- Keys must be unique. If duplicate keys are present in a map, only one of the
(
key
,value
) pairs will be retained. There is no guarantee which will be retained.
Custom types
You can create custom map
types, which lets you
create a named entry in the catalog for a specific type of map
.
Currently, custom types only provides a shorthand for referring to otherwise-annoying-to-type names.
text
to map
casts
The textual format for a map
is a sequence of key => value
mappings
separated by commas and surrounded by curly braces ({}
). For example:
SELECT '{a=>123.4, b=>111.1}'::map[text=>double] as m;
m
------------------
{a=>123.4,b=>111.1}
You can create nested maps the same way:
SELECT '{a=>{b=>{c=>d}}}'::map[text=>map[text=>map[text=>text]]] as nested_map;
nested_map
------------------
{a=>{b=>{c=>d}}}
Valid casts
Between map
s
Two map
types can only be cast to and from one another if they are
structurally equivalent, e.g. one is a custom map
type and the other is a built-in
map and their key-value types are structurally
equivalent.
From map
You can cast map
to and from the following types:
text
(by assignment)- Other
map
s as noted above.
To map
text
(explicitly)- Other
map
s as noted above.
Examples
Operators
Retrieve value with key (->
)
Retrieves and returns the target value or NULL
.
SELECT MAP['a' => 1, 'b' => 2] -> 'a' as field_map;
field_map
-----------
1
SELECT MAP['a' => 1, 'b' => 2] -> 'c' as field_map;
field_map
----------
NULL
Field accessors can also be chained together.
SELECT MAP['a' => ['b' => 1], 'c' => ['d' => 2]] -> 'a' -> 'b' as field_map;
field_map
-------------
1
Note that all returned values are of the map’s value type.
LHS contains RHS (@>
)
SELECT MAP['a' => 1, 'b' => 2] @> MAP['a' => 1] AS lhs_contains_rhs;
lhs_contains_rhs
------------------
t
RHS contains LHS (<@
)
SELECT MAP['a' => 1, 'b' => 2] <@ MAP['a' => 1] as rhs_contains_lhs;
rhs_contains_lhs
------------------
f
Search top-level keys (?
)
SELECT MAP['a' => 1.9, 'b' => 2.0] ? 'a' AS search_for_key;
search_for_key
----------------
t
SELECT MAP['a' => ['aa' => 1.9], 'b' => ['bb' => 2.0]] ? 'aa' AS search_for_key;
search_for_key
----------------
f
Search for all top-level keys (?&
)
Returns true
if all keys provided on the RHS are present in the top-level of
the map, false
otherwise.
SELECT MAP['a' => 1, 'b' => 2] ?& ARRAY['b', 'a'] as search_for_all_keys;
search_for_all_keys
---------------------
t
SELECT MAP['a' => 1, 'b' => 2] ?& ARRAY['c', 'b'] as search_for_all_keys;
search_for_all_keys
---------------------
f
Search for any top-level keys (?|
)
Returns true
if any keys provided on the RHS are present in the top-level of
the map, false
otherwise.
SELECT MAP['a' => 1, 'b' => 2] ?| ARRAY['c', 'b'] as search_for_any_keys;
search_for_any_keys
---------------------
t
SELECT MAP['a' => 1, 'b' => 2] ?| ARRAY['c', 'd', '1'] as search_for_any_keys;
search_for_any_keys
---------------------
f
Count entries in map (map_length
)
Returns the number of entries in the map.
SELECT map_length(MAP['a' => 1, 'b' => 2]);
map_length
------------
2