Supported PostgreSQL functions

This page defines the functions supported for PostgreSQL-dialect databases in Spanner.

The content on this page is based on the PostgreSQL documentation, which is available under thePostgreSQL License. There are differences in behavior between the PostgreSQL capabilities supported in Spanner and their open source PostgreSQL equivalents.

Mathematical functions

Unless otherwise specified, functions return the same data type as provided inthe argument.

FunctionExample/NotesDescription
abs(float4 | float8 | int8 | numeric)abs(-17) → 17Absolute value.
acos(float8)acos(1) → 0Inverse cosine, result in radians.
asin(float8)asin(1) → 1.5707963267948966Inverse sine, result in radians.
atan(float8)atan(1) → 0.7853981633974483Inverse tangent, result in radians.
atan2(x float8, y float8)atan2(1,0) → 1.5707963267948966Inverse tangent ofx/y, result in radians.
ceil(float8 | numeric)ceil(42.2::FLOAT8) → 43
ceil(-42.8::FLOAT8) → -42
Nearest integer greater than or equal to argument.
cos(float8)cos(0) → 1Cosine, argument in radians.
dexp(float8)dexp(3) → 20.085536923187668Raise e to the specified exponent (e^x).
div(x numeric, y numeric)div(9, 4) → 2Integer quotient of x/y (truncates towards zero).
dlog10(float8)Returns the base 10 logarithm of the provided value.
dlog1(float8)Returns the value's natural logarithm.
dpow(float8, float8)Returns the value of the first number raised to the power of the second number.
dsqrt(float8)Returns the argument's square root.
exp(float8)exp(1.0::FLOAT8) → 2.7182818284590452Exponential (e raised to the given power).
floor(float8 | numeric)floor(42.8::FLOAT8) → 42
floor(-42.8) → -43
Nearest integer less than or equal to argument.
ln(float8)ln(2.0::FLOAT8) → 0.6931471805599453Natural logarithm.
log(float8)log(100.0::FLOAT8) → 2Base 10 logarithm.
mod(x int8, y int8)
mod(x numeric, y numeric)
mod(9,4) → 1Remainder ofx/y.
power(float8, float8)power(9.0::FLOAT8, 3.0::FLOAT8) → 729a raised to the power ofb.

pow is an alias ofpower.

round(float8)round(42.4::FLOAT8) → 42Rounds to nearest integer.
sign(float8)sign(-8.4::FLOAT8) → -1Sign of the argument (-1, 0, or +1).
sin(float8)sin(1) → 0.8414709848078965Sine, argument in radians.
spanner.bit_reverse(bigint_value, /*preserve_sign=*/bool)spanner.bit_reverse(1, true);
--> returns 4611686018427387904
spanner.bit_reverse(10, false);
--> returns 5764607523034234880
Returns a bit-reversed value for abigint value. Whenpreserve_sign is true, this function provides the same bit-reversal algorithm used in bit-reversed sequence. SeeBit-reversed sequence.
spanner.cosine_distance(float4[], float4[])
spanner.cosine_distance(float8[], float8[])

Returns float8.

spanner.cosine_distance('{1.0, 2.0}'::float4[], '{3.0, 4.0}'::float4[]) → 0.016130

spanner.cosine_distance('{2.0, 1.0}'::float8[], '{4.0, 3.0}'::float8[]) → 0.016130

Computes thecosine distance between two vectors.

Each vector represents a quantity that includes magnitude and direction. Vectors are represented asfloat4[] orfloat8[].

A vector can have one or more dimensions. Both vectors in this function must share these same dimensions, and if they don't, an error is produced.

The ordering of numeric values in a vector doesn't impact the results produced by this function.

An error is produced if an element or field in a vector isnull.

A vector can't be a zero vector. A vector is a zero vector if all elements in the vector are 0. For example,'{0.0, 0.0}'::float4. If a zero vector is encountered, an error is produced.

If either of the arguments isnull,null is returned.

spanner.dot_product(int8[], int8[])
spanner.dot_product(float4[], float4[])
spanner.dot_product(float8[], float8[])

Returns float8.

spanner.dot_product('{100}'::int8[], '{200}'::int8[]) → 20000

spanner.dot_product('{100, 10}'::float4[], '{200, 6}'::float4[]) → 20060

Computes thedot product of two vectors. The dot product is computed by summing the product of corresponding vector elements.

Each vector represents a quantity that includes magnitude and direction. Vectors are represented asint8[],float4[], orfloat8[].

A vector can have one or more dimensions. Both vectors in this function must share these same dimensions, and if they don't, an error is produced.

The ordering of numeric values in a vector doesn't impact the results produced by this function.

An error is produced if an element or field in a vector isnull.

A vector can be a zero vector. A vector is a zero vector if it has no dimensions or if all elements in the vector are 0. For example,'{0.0, 0.0}'::float4. If a zero vector is encountered, an error is produced.

If either of the arguments isnull,null is returned.

spanner.euclidean_distance(float4[], float4[])
spanner.euclidean_distance(float8[], float8[])

Returns float8.

spanner.euclidean_distance('{1.0, 2.0}'::float4[], '{3.0, 4.0}'::float4[]) → 2.828

spanner.euclidean_distance('{2.0, 1.0}'::float8[], '{4.0, 3.0}'::float8[]) → 2.828

Computes theEuclidean distance between two vectors.

Each vector represents a quantity that includes magnitude and direction. Vectors are represented asfloat4[] orfloat8[].

A vector can have one or more dimensions. Both vectors in this function must share these same dimensions, and if they don't, an error is produced.

The ordering of numeric values in a vector doesn't impact the results produced by this function.

An error is produced if an element or field in a vector isnull.

A vector can be a zero vector. A vector is a zero vector if all elements in the vector are 0. For example,'{0.0, 0.0}'::float4.

If either of the arguments isnull,null is returned.

sqrt(float8)sqrt(2::FLOAT8) → 1.4142135623730951Square root.
tan(float8)tan(1) → 1.5574077246549023Tangent, argument in radians.
trunc(float8)trunc(42.8::FLOAT8) → 42
trunc(-42.8::FLOAT8) → -42
Truncates to integer (towards zero).
trunc(x numeric, y integer)trunc(42.4382, 2) → 42.43Truncates x to y decimal places.

Machine learning functions

FunctionExample / NotesDescription
spanner.ML_PREDICT_ROW(model_endpointtext|jsonb, argsjsonb)Returns JSONB.
spanner.ML_PREDICT_ROW is a scalar function that allows predictions on a per row basis and can appear anywhere a scalar expression is allowed in SQL statements. You can get online predictions in your SQL code by calling this function. For more information about this function, seeUse ML Predict for ML serving.

Array functions and comparisons

Array functions

FunctionExample / NotesDescription
array_cat(anyarray, anyarray)array_cat(ARRAY['cat', 'dog'], ARRAY['bird', 'turtle']) → {"cat", "dog", "bird", "turtle"}Concatenates two arrays.
array_to_string (array text_array,delimiter text [,null_string text ] ) array_to_string(ARRAY['a', NULL, 'c', 'd', 'e'], ',', '*')
→ a,*,c,d,e

array_to_string(ARRAY['a', NULL, 'c', 'd', 'e'], ',')
→ a,c,d,e

array_to_string(ARRAY['a', NULL, 'c', 'd', 'e'], ',', NULL)
→ NULL

array_to_string(ARRAY['a', NULL, 'c', 'd', 'e'], NULL, '*')
→ NULL
Converts the values of the elements in a text array to their string representations. The first argument is thearray which must be a text array. The second argument is a user-specifieddelimiter. The third (optional) argument is a user-specifiednull_string that the function substitutes for NULL values.

If you don't pass anull_string, and the function encounters a NULL value, the NULL value is not included in the results of the function.

If you pass NULL for either thedelimiter argument or thenull_string argument, then the entire array_to_string function returnsNULL.
array_upper(anyarray,dimension int8)array_upper(ARRAY[1, 2, 3, 4], 1) → 4Returns the upper bound of the requested array dimension. Note that Spanner does not support multidimensional arrays. The only dimension supported is1. For more information, seeWorking with arrays in PostgreSQL-dialect databases.
array_length(anyarray,dimension int8)array_length(ARRAY[1, 2, 3, 4], 1) → 4Returns the size of the array. ReturnsNULL for an empty orNULL array, or if the dimension isNULL. multidimensional arrays are not supported. The only dimension supported is1. For more information, seeWorking with arrays in PostgreSQL-dialect databases.
array(subquery)Returns anARRAY with one element for each row in the subquery. For more information, seeWorking with arrays in PostgreSQL-dialect databases.
unnest(anyarray)Expands anARRAY into a set of rows. For more information, seeWorking with arrays in PostgreSQL-dialect databases.

Array comparisons

Comparison syntaxExampleDescription
expression = ANY (anyarray)

expression = SOME (anyarray)
2 = ANY(array[1, 2]) → trueANY/SOME array comparison construct. Returnstrue if the evaluated value of the expression on the left is equal to any of the array elements. There are no differences betweenANY andSOME.

ANY/SOME only supports the= operator.
expression operator ALL (anyarray)(1+2) >= ALL(array[1, 2, 3]) → trueALL array comparison construct. Returnstrue if the expression on the left evaluates totrue when compared against all elements of the array with the specified operator.

=,<>, >, >=,<, and<= operators are supported withALL.

String functions

FunctionExample / NotesDescription
btrim(text)btrim(' xyxyyx ') → xyxyyxRemoves leading and trailing whitespace from the given string.
btrim(string text,characters text)btrim('xyxtrimyyx', 'xyz') → trimRemoves the longest string containing only characters incharacters from the start and end ofstring.
concat(text, text[, ...])

concat('abcde', 2::text, '', 22::text) → abcde222

concat('abcde', 2::text, NULL, 22::text) → NULL

Concatenates the provided text arguments. Non-text arguments must first be explicitly cast totext. Any SQL NULL argument results in a SQL NULL result.

textcat also concatenates text.

length(text)Returns int8.
length('mike') → 4
Returns the number of characters in the string.
lower(text)lower('PostgreSQL') → postgresqlConverts the string to all lower case.
lpad(text, int8)lpad('hi', 7) → ␣␣␣␣␣hiExtends the string to the specified length by prepending spaces. If the string is already longer than length then it is truncated on the right.
lpad(string text,length int8,fill text)lpad('hi', 7, 'xy') → xyxyxhiExtends the string to lengthlength by prepending the charactersfill, repeated. If the string is already longer thanlength then it is truncated on the right.
ltrim(text)ltrim(' test') → testRemoves leading spaces from a string.
ltrim(string text,characters text)ltrim('zzzytest', 'xyz') → testRemoves the longest string containing only characters incharacters from the start ofstring.
quote_ident(string text)quote_ident('Example') → "Example"Given a string argument, returns a quoted identifier suitable for inclusion in SQL statements.
regexp_replace(string text,pattern text,replacement text)regexp_replace('Thomas', '.[mN]a.', 'M') → ThMReplaces substrings resulting from the first match of a POSIX regular expression. For more information, see the open source PostgreSQLPOSIX Regular Expressions documentation.
repeat(text, int8)Returns text.
repeat('Pg', 4) → PgPgPgPg
Repeats a string the specified number of times.
replace(string text,from text,to text)replace('abcdefabcdef', 'cd', 'XX') → abXXefabXXefReplaces all occurrences instring of substringfrom with substringto.
reverse(text)reverse('abcde') → edcbaReverses the order of the characters in the string.
rpad(text, int8)Returns text. In the following example, the result includes three trailing spaces.
rpad('hi', 5) → hi␣␣␣
Extends the string to the specified length by appending spaces. If the string is already longer than the specified length then it is truncated.
rpad(string text,length int8,fill text)Returns text.
rpad('hi', 5, 'xy') → hixyx
Extends thestring to lengthlength by appending the charactersfill, repeated if necessary. If the string is already longer thanlength then it is truncated.
rtrim(text)rtrim('test ') → testRemoves trailing spaces from a string.
rtrim(string text,characters text)rtrim('testxxzx', 'xyz') → testRemoves the longest string containing only characters incharacters from the end of thestring.
spanner.soundex(text)spanner.soundex('Ashcraft') -> A261Returns aSTRING that represents theSoundex code for value.

Soundex produces a phonetic representation of a string. It indexes words by sound, as pronounced in English. It's typically used to help determine whether two strings have similar English-language pronunciations, such as the family namesLevine andLavine, or the wordsto andtoo,

The result of the Soundex consists of a letter followed by 3 digits. Non-latin characters are ignored. If the remaining string is empty after removing non-Latin characters, an emptystring is returned.

starts_with(string text,prefix text)Returns Boolean.
starts_with('alphabet', 'alph') → true
Returns true ifstring starts withprefix.
strpos(string text,substring text)Returns int8.
strpos('high', 'ig') → 2
Returns first starting index of the specifiedsubstring withinstring, or zero if it's not present.
substr(string text,start int8)substr('alphabet', 3) → phabetExtracts the substring of the provided text starting at the specified character.
substr(string text,start int8,count int8)substr('alphabet', 3, 2) → phExtracts the substring ofstring starting at thestart character, and extending forcount characters.
substring(string text,pattern text)substring('exampletext', 'tex.') → 'text'Extracts the substring that matches a POSIX regular expression. For more information, see the open source PostgreSQLPOSIX Regular Expressions documentation.
textcat(string text,string text)

textcat('abcde', '222') → abcde222

textcat('abcde', NULL) → NULL

Concatenates the text representations of the two arguments. Any SQL NULL argument results in a SQL NULL result.
upper(string text)upper('hello') → HELLOConverts the string to all upper case.

Binary string functions

FunctionExample / NotesDescription
btrim(bytes bytea,bytesremoved bytea)btrim('\x1234567890'::bytea, '\x9012'::bytea) → \x345678Removes the longest string containing only bytes appearing inbytesremoved from the start and end ofbytes.
length(bytea)Returns int8.
length('\x1234567890'::bytea) → 5
Returns the number of bytes in the binary string.
sha256(bytea)sha256('abc'::bytea) → ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=Computes the SHA-256 hash of the binary string.
sha512(bytea)sha512('abc'::bytea) → 3a81oZNherrMQXNJriBBMRLm+k6JqX6iCp7u5ktV05ohkpkqJ0/BqDa6PCOj/uu9RU1EI2Q86A4qmslPpUyknw==Computes the SHA-512 hash of the binary string.
substr(bytes bytea,start int8)substr('\x1234567890'::bytea, 3) → \x567890Extracts the substring ofbytes starting at thestart byte.
substr(bytes bytea,start int8,count int8)substr('\x1234567890'::bytea, 3, 2) → \x5678Extracts the substring ofbytes starting at thestart byte, and extending forcount bytes.

Hash functions

FunctionExample / NotesDescription
spanner.farm_fingerprint(value bytea | text)spanner.farm_fingerprint('abc') → 2640714258260161385Computes the fingerprint ofvalue using the FarmHash Fingerprint64 algorithm.

Date and time functions

This section describes the date and time functions that areavailable in Spanner.

Date and time functions

FunctionExample / NotesDescription
current_dateSELECT CURRENT_DATE;
Result: 2022-05-13
Returns currentdate.
current_timestampSELECT CURRENT_TIMESTAMP;
Result: 2022-05-13T16:30:29.880850967Z
Returns current date and time intimestamptz format.
date_trunc(text, timestamptz)date_trunc('day', timestamptz '2020-01-02 13:14:15+0') -> 2020-01-02 00:00:00-08Truncates a timestamp to the precision of the provided field. The truncation is done with respect to the default time zone (America/Los_Angeles)
date_trunc(text, timestamptz, text)date_trunc('day', timestamptz '2001-02-16 20:38:40+00', 'Australia/Sydney') -> 2001-02-16 08:00:00-05Truncates a timestamp to the precision of the provided field. The trunctation is done with respect to the provided time zone
extract(field FROM source)extract(decade from timestamptz '2001-01-01 01:00:00+00') -> 200Retrieves subfields from date and time values and returns values of type numeric. Source can use the date or timestamptz data type.
make_date(int8, int8, int8)make_date(2013, 7, 15) → 2013-07-15Creates date from year, month, and day fields (negative years signify BCE).
now()now() → 2022-05-02T19:17:45.145511221ZReturns current date and time intimestamptz format.
to_timestamp(int8)to_timestamp(1284352323) → 2010-09-13T04:32:03ZConverts Unix epoch (seconds since 1970-01-01 00:00:00+00) totimestamptz format.

Spanner specific date and time functions

Spanner has several functions that perform date or time maththat acceptINTERVAL values inTEXT form. You must use thespanner namespace to call these functions.

FunctionExample / NotesDescription
spanner.date(timestamptz, text)spanner.date('2025-04-14 03:38:40+00'::timestamptz, 'America/New_York') -> 2025-04-13

Extracts date from a timestamptz in a specified time zone.

If a time zone value is not provided in the first parameter, the time zone value defaults toAmerica/Los_Angeles. For example,spanner.date('2025-04-14 23:38:40'::timestamptz, 'America/New_York') -> 2025-04-15

spanner.date_bin(text, timestamptz, timestamptz)spanner.date_bin('15 minutes', timestamptz '2001-02-16 20:38:40Z', timestamptz '2001-02-16 20:05:00Z') -> 2001-02-16 20:35:00ZBins input into a specified interval aligned with a specified origin.
spanner.timestamptz_add(timestamptz, text)spanner.timestamptz_add(timestamptz '2001-02-16 20:38:40Z', '1 day 3min') -> 2001-02-17 20:41:40ZAdds an interval to a timestamptz.
spanner.timestamptz_subtract(timestamptz, text)spanner.timestamptz_subtract(timestamptz '2001-02-16 20:38:40Z', '1 month 2 hours') -> 2001-01-16 18:38:40ZSubtracts an interval from a timestamptz.

Search functions

Spanner has several functions that perform full-text searchoperations. For more information, seeFull-text search. For more information onsearch functions, see the GoogleSQLSearch functionssection.

Indexing

Functions that you can use to create search indexes.

FunctionExample / NotesDescription
spanner.token(value text/bytea)Returns a
spanner.tokenlist
Constructs an exact matchtokenlist value by tokenizing a text value verbatim to accelerate exact match expressions.
spanner.tokenize_bool(
value bool)
Returns a
spanner.tokenlist.
Constructs a booleantokenlist value by tokenizing aBOOL value to accelerate boolean match expressions.
spanner.tokenize_fulltext(
value text/text[]
[, language_tag text]
[, content_type text]
[, token_category text])
Returns a
spanner.tokenlist.
Constructs a full-texttokenlist value by tokenizing text for full-text matching.
spanner.tokenize_jsonb(
value jsonb)
Returns a
spanner.tokenlist.
Constructs a JSONtokenlist value by tokenizing aJSONB value to accelerate JSON predicates.
spanner.tokenize_ngrams(
value text
[, ngram_size_min int8]
[, ngram_size_max int8]
[, remove_diacritics bool])
Returns a
spanner.tokenlist.
Constructs an n-gramtokenlist value by tokenizing a text value for matching n-grams.
spanner.tokenize_number(
value int8
[, comparison_type text]
[, algorithm text]
[, min int8]
[, max int8]
[, granularity int8]
[, tree_base int8]
[, ieee_precision int8])
Returns a
spanner.tokenlist.
Constructs a numerictokenlist value by tokenizing numeric values to accelerate numeric comparison expressions.
spanner.tokenize_substring(
value text/text[]
[, language_tag text]
[, ngram_size_min int8]
[, ngram_size_max int8]
[, relative_search_types text[]]
[, content_type text]
[, short_tokens_only_for_anchors bool]
[, remove_diacritics bool])
Returns a
spanner.tokenlist.
Constructs a substringtokenlist value by tokenizing text for substring matching.
spanner.tokenlist_concat(tokens spanner.tokenlist[])Returns a
spanner.tokenlist.
Displays a human-readable representation of tokens present in atokenlist value for debugging purposes.

Retrieval and presentation

Functions that you can use to search for data, score the search result, orformat the search result.

FunctionExample / NotesDescription
spanner.score(
tokens spanner.tokenlist,
query text
[, dialect text]
[, language_tag text]
[, enhance_query bool]
[, options jsonb])
Returns afloat8.Calculates a relevance score of atokenlist for a full-text search query. The higher the score, the stronger the match.
spanner.score_ngrams(
tokens spanner.tokenlist,
ngrams_query text
[, language_tag text]
[, algorithm text])
Calculates the relevance score of atokenlist for a fuzzy search. The higher the score, the stronger the match.
spanner.search(
tokens spanner.tokenlist,
query text
[, dialect text]
[, language_tag text]
[, enhance_query bool])
Returns abool.ReturnsTRUE if a full-text search query matches tokens.
spanner.search_ngrams(
tokens spanner.tokenlist,
ngrams_query text
[, language_tag text]
[, min_ngrams int8]
[, min_ngrams_percent float8])
Returns abool.Checks whether enough n-grams match the tokens in a fuzzy search.
spanner.search_substring(
tokens spanner.tokenlist
[, query text]
[, language_tag text]
[, relative_search_type text])
Returns abool.ReturnsTRUE if a substring query matches tokens.
spanner.snippet(
value text,
query text
[, language_tag text]
[, enhance_query bool]
[, max_snippet_width int8]
[, max_snippets int8]
[, content_type text])
Returnsjsonb.Gets a list of snippets that match a full-text search query.

Debugging

Functions that you can use for debugging.

FunctionExample / NotesDescription
spanner.debug_tokenlist(
spanner.tokenlist)
Returnstext.Displays a human-readable representation of tokens present in thetokenlist value for debugging purposes.

JSONB functions

Spanner supports severalJSONB functions.

For more information, see thePostgreSQLJSONB documentation.

JSONB functions

FunctionExample / NotesDescription
jsonb_array_elements(JSONB)

jsonb_array_elements('[1, "abc", {"k": "v"}]'::jsonb)

      /*---------------------*      | jsonb_array_elements |      +----------------------+      | '1'                  |      | '"abc"'              |      | '{"k": "v"}'         |      *---------------------*/

Expands ajsonb array to a set ofjsonb values. Returns multiple rows, with one element per row. Unlike open source PostgreSQL, this can only be called as a table valued function in theFROM clause.

jsonb_build_array(ANY[, ...])

jsonb_build_array(1, 'abc') → [1, "abc"]

Builds ajsonb array out of a variadic argument list.

jsonb_build_object(TEXT, ANY[, ...])

jsonb_build_object('key1', 1, 'key2', 'abc') → {"key": 1, "key2": "abc"}

Builds ajsonb object out of a variadic argument list. The argument list consists of alternating keys and values. The keys are of typetext.

jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after bool]) → jsonb

jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"') → {"a": [0, "new_value", 1, 2]}

jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"', true) → {"a": [0, 1, "new_value", 2]}

Returnstarget withnew_value inserted as specified bypath. If the item designated by the path is an array element,new_value is inserted before that item ifinsert_after isfalse (which is the default behavior), or after it ifinsert_after istrue. If the item designated by the path is an object field,new_value is inserted only if the object does not already contain that key. All earlier steps in the path must exist, or thetarget is returned unchanged. As with the path-oriented operators, negative integers that appear in the path count from the end of JSON arrays. If the last path step is an array index that is out of range, the new value is added at the beginning of the array if the index is negative or at the end of the array if it is positive.
jsonb_set(target jsonb, path text[], new_value jsonb [, create_if_missing bool]) → jsonb

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', '[2,3,4]', false) → [{"f1": [2, 3, 4], "f2": null}, 2, null, 3]

jsonb_set('[{"f1":1,"f2":null},2]', '{0,f3}', '[2,3,4]') → [{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2]

Returnstarget with the item designated bypath replaced bynew_value, or withnew_value added ifcreate_if_missing is true (which is the default behavior) and the item designated by the path does not exist. All earlier steps in the path must exist, or thetarget is returns unchanged. As with the path-oriented operators, negative integers that appear in the path count from the end of JSON arrays. If the last path step is an array index that is out of range. Ifcreate_if_missing is true and the last path step is an out-of-range array index, the new value is added to the beginning of the array (if the index is negative) or the end of the array (if the index is positive).
jsonb_set_lax(target jsonb, path text[], new_value jsonb [, create_if_missing bool [, null_value_treatment text]]) → jsonb

jsonb_set_lax('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', null) → [{"f1": null, "f2": null}, 2, null, 3]

jsonb_set_lax('[{"f1":99,"f2":null},2]', '{0,f3}', null, true, 'return_target') → [{"f1": 99, "f2": null}, 2]

Ifnew_value is notNULL, this function behaves identically tojsonb_set. Otherwise, this function behaves according to the value ofnull_value_treatment which must be one ofraise_exception,use_json_null,delete_key, orreturn_target. The default isuse_json_null.

jsonb_set_lax has the same behavior asjsonb_set unless thenull_value_treatment parameter is a SQL null, then this function returns an error. If thenew_value parameter is a SQL null then thejsonb_set_lax function returns behavior based on thenull_value_treatment parameter.

jsonb_strip_nulls(jsonb) → jsonb

jsonb_strip_nulls('[{"f1":1, "f2":null}, 2, null, 3]') → [{"f1": 1}, 2, null, 3]

Deletes all object fields that have null values from a defined JSON array, recursively. Does not affect null values outside of object fields.
to_jsonb(ANY)

to_jsonb(1.2334000) → 1.2334000

to_jsonb(true) → true

to_jsonb('abc'::varchar) → abc

Converts the given value tojsonb.

jsonb_object_keys(jsonb)

jsonb_object_keys('{"a":1, "b":{"c":1, "d":4}}'::jsonb) → {"a", "b"}

Returns a set of keys in the top-leveljsonb object as a set ofstring values. Unlike in open source PostgreSQL, this function can only be called in theFROM clause.

The keys are de-duplicated and returned in length-first lexicographic order.

jsonb_typeof(jsonb)

jsonb_typeof('-123.4') → number

jsonb_typeof('{"a":1, "b":2}') → object

jsonb_typeof('["a", "b", "c"]') → array

jsonb_typeof('null'::jsonb) → null

jsonb_typeof(NULL) IS NULL → true

Returns the type of the top-leveljsonb value as a text string. The possible types areobject,array,string,number,boolean, andNULL.

Thenull result shouldn't be confused with a SQL NULL, as the examples illustrate.

Spanner specific JSONB functions

Spanner has several JSONB functions that are not available inopen source PostgreSQL. You must use thespannernamespace to call these functions.

FunctionExample / NotesDescription
spanner.bool_array(jsonb)spanner.bool_array('[true, false]'::jsonb) → [true, false]

spanner.bool_array('["true"]'::jsonb) → ERROR
Returns an array ofboolean values from ajsonb array. Raises an error if the argument is not an array of boolean values.
spanner.float32_array(jsonb)spanner.float32_array('[1, -2, 3.0]'::jsonb) → [1.0, -2.0, 3.0]

spanner.float32_array('[1e100]'::jsonb) → ERROR
Returns an array ofreal values from ajsonb array. Raises an error if the argument is not an array of number values inreal domain.
spanner.float64_array(jsonb)spanner.float64_array('[1, -2, 3.0]'::jsonb) → [1.0, -2.0, 3.0]

spanner.float64_array('[1e100]'::jsonb) → ERROR
Returns an array ofreal values from ajsonb array. Raises an error if the argument is not an array of number values indouble precision domain.
spanner.int64_array(jsonb)spanner.int64_array('[1, -2, 3.0]'::jsonb) → [1, -2, 3]

spanner.int64_array('[1.1]'::jsonb) → ERROR
Returns an array ofint8 values from ajsonb array. Raises an error if the argument is not an array of number values inint8 domain.
spanner.jsonb_query_array(jsonb)spanner.jsonb_query_array('[1, "abc", {"k": "v"}]'::jsonb) → [1, "abc", {"k": "v"}] Returns an array ofjsonb values from ajsonb array. Similar tojsonb_array_elements in PostgreSQL, except that it returns an array of values rather than a set of values.
spanner.string_array(jsonb)spanner.string_array('["a", "b", "c"]'::jsonb) → ['a', 'b', 'c']

spanner.string_array('[null]'::jsonb) → ERROR
Returns an array oftext values from ajsonb array. Raises an error if the argument is not an array of string values.

Interval functions

FunctionExample / NotesDescription
make_interval ( [ years int8 [, months int8 [, weeks int8 [, days int8 [, hours int8 [, mins int8 [, secs double precision ]]]]]]] ) → intervalSELECT make_interval(years => 1, months => 2, weeks => 3, days => 15, hours => 10, mins => 30, secs => 15.1) -> P1Y2M36DT10H30M15.1SCreates an interval from years, months, weeks, days, hours, minutes, and seconds fields. The default value for each of the fields is 0.
-intervalSELECT -INTERVAL '1 year 2 months 15 days 45 seconds 500 microseconds';Result: P-1Y-2M-15DT-45.0005SNegate an interval.
interval + interval → intervalSELECT INTERVAL '1 year 2 months 15 days' + INTERVAL '1 hour 15 minutes 45 seconds 500 milliseconds';Result: P1Y2M15DT1H15M45.5SAdd intervals.
interval - interval → intervalSELECT INTERVAL '1 year 2 months 10 hours 30 minutes' - INTERVAL '15 days 45 seconds 500 microseconds';Result: P1Y2M-15DT10H29M14.9995SSubtract intervals.
interval * double precision → intervalSELECT INTERVAL '4 months 12 days 20 seconds' * 4.0;Result: P1Y4M48DT1M20SMultiply an interval by a scalar.
interval / double precision → intervalSELECT INTERVAL '1 hour' / 2.5;Result: PT24MDivide an interval by a scalar.
timestamptz + interval → timestamptzSELECT TIMESTAMP WITH TIME ZONE '2021-12-18T10:00:00+00' + INTERVAL '2 months 15 days 40 minutes';Result: 2022-03-05T10:40:00ZAdd an interval to a timestamp with a time zone.
timestamptz - interval → timestamptzSELECT TIMESTAMP WITH TIME ZONE '2024-12-18T10:00:00+00' - INTERVAL '2 months 15 days 40 minutes';Result: 2024-10-03T08:20:00ZSubtract an interval from a timestamp with a time zone.
timestamptz - timestamptz → intervalSELECT TIMESTAMPTZ '2024-12-18T10:00:00+00' - TIMESTAMPTZ '2024-10-03T08:20:00Z'Result: PT1825H40M Subtract timestamps with a time zone. Unlike open source PostgreSQL, Spanner doesn't convert 24 hour time periods into days.
justify_hours(interval) → intervalSELECT justify_hours(interval '50 hours 10 minutes')Result: P2DT2H10MSELECT justify_hours(interval '-12 day 50 hours 10 minutes')Result: P-9DT-21H-50MNormalizes 24-hour time periods into full days. Adjusts time and days to have the same sign.
justify_days(interval) → intervalSELECT justify_days(interval '45 days 50 hours 10 minutes')

Result: P1M15DT50H10M

SELECT justify_days(interval '-1 year 45 days')

Result: P-10M-15D
Normalizes 30-day time periods into full months. Adjusts days and months to have the same sign.
justify_interval(interval) → intervalSELECT justify_interval(INTERVAL '29 days 60 hours')Result: P1M1DT12HSELECT justify_interval(INTERVAL '-34 days 60 hours')Result: P-1M-1DT-12HNormalizes 24-hour time periods into full days, then 30-day time periods into full months. Adjusts all parts to have the same sign.
extract(field FROM source) → numericSELECT extract(SECOND FROM INTERVAL '1 year 2 months 15 days 10 hours 30 minutes 15 seconds 100 milliseconds')Result: 15.100000Retrieves subfield from an interval value and returns a value of type numeric.

Aggregate functions

FunctionExample / NotesDescription
array_agg(anynonarray [ORDER BY input_sort_columns])Inserts the given values, including nulls, into an array.input_sort_columns, if specified, must have the same syntax as a query-level ORDER BY clause and is used to sort the inputs.
avg(float4 | float8 | interval | int8 | numeric)Computes the average (arithmetic mean) of all the non-null input values.
bit_and(int8)Computes the bitwise AND of all non-null input values.
bit_or(int8)Computes the bitwise OR of all non-null input values.
bool_and(bool)Returns true if all non-null input values are true, otherwise false.
bool_or(bool)Returns true if any non-null input value is true, otherwise false.
count(*)Returns int8.Computes the number of input rows.
count(bool | bytea | float4 | float8 | interval | int8 | text | timestamptz)Returns int8.Computes the number of input rows in which the input value is not null.
every(bool)Equivalent tobool_and().
max(float4 | float8 | interval | int8 | numeric | text | timestamptz)Returns same type as input type.Computes the maximum of the non-null input values.
min(float4 | float8 | interval | int8 | numeric | text | timestamptz)Computes the minimum of the non-null input values.
string_agg(value bytea,delimiter bytea)Concatenates the non-null input values into a string. Each value after the first is preceded by the correspondingdelimiter (if it's not null).
string_agg(value text,delimiter text [ORDER BY input_sort_columns])Concatenates the non-null input values into a string. Each value after the first is preceded by the correspondingdelimiter (if it's not null).input_sort_columns, if specified, must have the same syntax as a query-level ORDER BY clause and is used to sort the inputs.
sum(float4 | float8 | interval | int8 | numeric)Computes the sum of the non-null input values.

Conditional functions

FunctionExample / NotesDescription
coalesce(ANY REPEATED)coalesce(NULL, 'abc', 'def') → 'abc'Returns the first of its arguments that is not null. Null is returned only if all arguments are null. It is often used to substitute a default value for null values when data is retrieved for display.

The arguments must all use the same data type. The result has the same data type.

greatest(ANY REPEATED)greatest(6, 10, 3, 14, 2) → 14Returns the largest value from a list of any number of expressions. The expressions must all use the same data type. The result has the same data type. NULL values in the list are ignored. The result is NULL only if all the expressions evaluate to NULL.
least(ANY REPEATED)least(6, 10, 3, 14, 2) → 2Returns the smallest value from a list of any number of expressions. The expressions must all use the same data type. The result will have the same data type. NULL values in the list are ignored. The result is NULL only if all the expressions evaluate to NULL.
nullif(value1 ANY,value2 ANY)Returns a null value ifvalue1 equalsvalue2; otherwise it returnsvalue1. The two arguments must use comparable types. Specifically, they are compared exactly as if you had writtenvalue1 = value2, so there must be a suitable = operator available.

The result has the same type as the first argument, but there is a subtle difference. What is actually returned is the first argument of the implied = operator, and in some cases that is promoted to match the second argument's type. For example,NULLIF(1, 2.2) yields a numeric, because there is no integer = numeric operator, only numeric = numeric.

ISNULLdatatype ISNULL → booleanTests whether value is null (non-standard syntax).
NOTNULLdatatype NOTNULL → booleanTests whether value is not null (non-standard syntax).
IS TRUEboolean IS TRUE → boolean

true IS TRUE → true
NULL::boolean IS TRUE → false (rather than NULL)
Tests whether boolean expression yields true.
IS NOT TRUEboolean IS NOT TRUE → boolean

true IS NOT TRUE → false
NULL::boolean IS NOT TRUE → true (rather than NULL)
Tests whether boolean expression yields false or unknown.
IS FALSEboolean IS FALSE → boolean

true IS FALSE → false
NULL::boolean IS FALSE → false (rather than NULL)
Tests whether boolean expression yields false.
IS NOT FALSEboolean IS NOT FALSE → boolean

true IS NOT FALSE → true
NULL::boolean IS NOT FALSE → true (rather than NULL)
Tests whether boolean expression yields true or unknown.
IS UNKNOWNboolean IS UNKNOWN → boolean

true IS UNKNOWN → false
NULL::boolean IS UNKNOWN → true (rather than NULL)
Tests whether boolean expression yields unknown.
IS NOT UNKNOWNboolean IS NOT UNKNOWN → boolean

true IS NOT UNKNOWN → true
NULL::boolean IS NOT UNKNOWN → false (rather than NULL)
Tests whether boolean expression yields true or false.

Pattern matching functions

This section describes the pattern matching functions that areavailable in Spanner.

Pattern matching functions

FunctionExample / NotesDescription
like(string bytea,pattern bytea)Returns Boolean.
Returns true if the string matches the supplied pattern. For more information about theLIKE expression, see thepostgresql.org documentation.
like(string text,pattern text)Returns Boolean.
Returns true if the string matches the supplied pattern. For more information about theLIKE expression, see thepostgresql.org documentation.
regexp_match(string text,pattern text)
regexp_match('exambarbequeple','(bar)(beque)') → {'bar', 'beque'}
Returns an array of matching substrings within the first match of a POSIX regular expression pattern to a string. If there is no match, then the result isNULL. If there is a match, and the pattern contains parenthesized subexpressions, then the result is a text array whosenth element is the substring matching thenth parenthesized subexpression of the pattern (not counting non-capturing parentheses).
regexp_match(string text,pattern text,flags text)
regexp_match('examBaRBeQUEple','(bar)(beque)', 'i') → {'BaR', 'BeQUE'}
Returns an array of matching substrings within the first match of a POSIX regular expression pattern to a string. If there is no match, the result isNULL. If a match is found and the pattern contains parenthesized subexpressions, then the result is a text array whosenth element is the substring matching thenth parenthesized subexpression of the pattern (not counting non-capturing parentheses). The flags parameter contains zero or more single-letter flags that change the function's behavior. For more information about using flags, see the open source PostgreSQLEmbedded-option Table documentation.
regexp_split_to_array(string text,pattern text)
regexp_split_to_array('the quick brown fox jumps over the lazy dog','\s+') → {'the','quick',''brown','fox','jumps','over','the','lazy','dog'}
Splits a string using a POSIX regular expression pattern as a delimiter. If there is no match to the pattern, the function returns the string. If there is at least one match, then for each match, the function returns the text from the end of the last match (or the beginning of the string) to the beginning of the match. When there are no more matches, the function returns the text from the end of the last match to the end of the string.
regexp_split_to_array(string text,pattern text,flags text)
regexp_split_to_array('thE QUick bROWn FOx jUMPs ovEr The lazy dOG','e', 'i') → {'th',' QUick bROWn FOx jUMPs ov','r Th',' lazy dOG'}
Splits a string using a POSIX regular expression pattern as a delimiter. If there is no match to the pattern, then the function returns the string. If there is at least one match, then for each match, the function returns the text from the end of the last match (or the beginning of the string) to the beginning of the match. When there are no more matches, the function returns the text from the end of the last match to the end of the string. The flags parameter contains zero or more single-letter flags that change the function's behavior. For more information about using flags, see the open source PostgreSQLEmbedded-option Table documentation.

Formatting functions

FunctionExample / NotesDescription
to_char(interval_value interval,format text)SELECT to_char(INTERVAL '1 year 2 months 15 days 10 hours 30 minutes 15 seconds 100 milliseconds', 'YYYY-MM-DD HH24:MI:SS.MS');Converts interval to string according to the given date format.[1]
to_char(number int8,format text)to_char(125, '999') → 125Converts int8 to string according to the given format.[2]
to_char(number numeric,format text)to_char(-125.8, '999D99S') → 125.8-Converts numeric to string according to the given format.[2]
to_char(number float4,format text)to_char(125.8::float4, '999D9') → 125.8Converts float4 to string according to the given format.[2]
to_char(number float8,format text)to_char(125.8::float8, '999D9') → 125.8Converts float8 to string according to the given format.[2]
to_char(timestamp timestamptz,format text)to_char(timestamp '2002-04-20 17:31:12.66', 'HH12:MI:SS') → 05:31:12Converts timestamptz to string according to the given date format.[3]
to_number(number text,format text)to_number('12,454.8-', '99G999D9S') → -12454.8Converts string to numeric according to the given format.[2]
to_date(date text,format text)to_date('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05Converts string to date according to the given date format.[3]
to_timestamp(timestamp timestamptz,format text)to_timestamp('05 Dec 2000', 'DD Mon YYYY') → 2000-12-05 00:00:00-05Converts string to timestamptz format according to the given date time format.[3]

[1]For a list of supported numeric formatting, seeTemplate Patterns for Numeric Formatting.

[2]For a list of supported numeric formatting, seeTemplate Patterns for Numeric Formatting.

[3]For a list of supported date/time formatting, seeSupported formats fordate data type andSupported formats fortimestamptz data type.

Sequence functions

FunctionExample / NotesDescription
nextval (varchar) → bigintnextval ('MySequence')Takes a sequence name string and returns the next sequence value in thebigint data type. This function is only allowed in read-write transactions
spanner.get_internal_sequence_state(varchar)spanner.get_internal_sequence_state('MySequence')Gets the current sequence internal counter before bit reversal. As the sequence generates values, its internal counter changes. This function is useful when using import or export, and for migrations. Ifnextval ('MySequence') is never called on the sequence, then this function returns NULL.

Set returning functions

This section describes functions that possibly return more than one row.

Unlike open source PostgreSQL, Spanner only supports these functions in the `FROM` clause.
generate_series(start int8 | numeric,end int8 | numeric [,step int8 | numeric])

SELECT * FROM generate_series(2, 4)

      /*---------------------*      | generate_series      |      +----------------------+      | 2                    |      | 3                    |      | 4                    |      *---------------------*/

SELECT * FROM generate_series(3, 0, -2)

      /*---------------------*      | generate_series      |      +----------------------+      | 3                    |      | 1                    |      *---------------------*/

Generates a series of values. The function accepts two arguments: thestart value and theend value. An optional thirdstep argument specifies the increment between the first two arguments (default is 1).

This function generates a set of rows, with each row representing a value from the series. The series begins at thestart value and includes values up to and including theend value, or until the final increment is reached.

Utility functions

FunctionExample / NotesDescription
spanner.generate_uuid()SELECT spanner.generate_uuid() AS uuid → 4192bff0-e1e0-43ce-a4db-912808c32493Returns a random universally unique identifier (UUID) (Version 4) as a string. that Spanner can use for primary key columns. The returned string consists of 32 hexadecimal digits in five groups separated by hyphens in the form 8-4-4-4-12. The hexadecimal digits represent 122 random bits and 6 fixed bits, in compliance with RFC 4122 section 4.4. The returned string is lowercase.

Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2025-12-15 UTC.