[ 
https://issues.apache.org/jira/browse/FLINK-32260?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Hanyu Zheng updated FLINK-32260:
--------------------------------
    Description: 
Implement the array_slice function to extract a subset of elements from an 
array.
This function returns a subset of the input array, starting from 'start_offset' 
and ending at 'end_offset'. These offsets are 1-based and can be positive 
(counted from the start of the array) or negative (counted from the end of the 
array).

Initially, the function checks if 'start_offset' or 'end_offset' are 0. If so, 
they are treated as starting from the beginning of the input array.

Next, the function checks if 'start_offset' is after 'end_offset' or if the 
input array is empty. In such cases, it will return an empty array.

For the remaining cases, the function proceeds as follows: if either 
'start_offset' or 'end_offset' exceed the array bounds, they are adjusted to 
the size of the array. Conversely, if the absolute value of a negative 
'start_offset' or 'end_offset' is greater than the size of the array, the 
corresponding offset is reset to the beginning of the array, which is 1.

The function will return null if any input is null.
Syntax:

 
code
{code:java}
ARRAY_SLICE(array, start_offset, end_offset){code}
{{ }}
Arguments:

array: The array that contains the elements you want to slice.
start_offset: The inclusive starting offset.
end_offset: The inclusive ending offset.

An offset can be positive or negative. A positive offset starts from the 
beginning of the input array and is 1-based. A negative offset starts from the 
end of the input array. Out-of-bounds offsets are supported. if start_offset == 
0 or end_offset == 0, we treat them start from the beginning of the input array.

Returns:
The input array can contain NULL elements. NULL elements are included in the 
resulting array.
Returns NULL if array, start_offset, or end_offset is NULL.
Returns an empty array if array is empty.
Returns an empty array if the position of the start_offset in the array is 
after the position of the end_offset.

Examples:

 
{code:java}
SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, 3)
Output: [a, b, c]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -1, -3)
Output: []

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -3, -1)
Output[c, d, e]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 3, 3)
Output[c]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, 30)
Output[a, b,c,d,e]
SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, -30)
Output[]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -30, 30)
Output[a, b, c, d, e]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -30, -5)
Output[a]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 5, 30)
Output[e]
 
SELECT ARRAY_SLICE(['a', 'b', NULL, 'd', 'e'], 1, 3) 
Output[a, b, null]

SELECT ARRAY_SLICE(['a', 'b', NULL, 'd', 'e'], 0, 0) 
Output[a]
{code}
 

see also:
spark: [https://spark.apache.org/docs/latest/api/sql/index.html#slice]
google cloud: 
[https://cloud.google.com/spanner/docs/reference/standard-sql/array_functions#array_slice]
ClickHouse: 
[https://clickhouse.com/docs/en/sql-reference/functions/array-functions#arrayslice]
DockDb: [https://duckdb.org/docs/sql/functions/nested#list-functions]

  was:
Implement the array_slice function to extract a subset of elements from an 
array.

Returns a subset of input array between start_offset and end_offset. The 
offsets are 1-based and can be positive (from start) or negative (from end). If 
start_offset or end_offset exceed array bounds, they're set to array size. if 
start_ offset or end_offset is smaller than 1, they are set to 1. Returns null 
if any input is null, and return an empty array if start_offset is after 
end_offset or if the input array is empty.

if start_offset == 0 or end_offset == 0, we treat them start from the beginning 
of the input array.

Syntax:

 
code
{code:java}
ARRAY_SLICE(array, start_offset, end_offset){code}
{{ }}
Arguments:

array: The array that contains the elements you want to slice.
start_offset: The inclusive starting offset.
end_offset: The inclusive ending offset.

An offset can be positive or negative. A positive offset starts from the 
beginning of the input array and is 1-based. A negative offset starts from the 
end of the input array. Out-of-bounds offsets are supported. if start_offset == 
0 or end_offset == 0, we treat them start from the beginning of the input array.

Returns:
The input array can contain NULL elements. NULL elements are included in the 
resulting array.
Returns NULL if array, start_offset, or end_offset is NULL.
Returns an empty array if array is empty.
Returns an empty array if the position of the start_offset in the array is 
after the position of the end_offset.

Examples:

 
{code:java}
SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, 3)
Output: [a, b, c]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -1, -3)
Output: []

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -3, -1)
Output[c, d, e]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 3, 3)
Output[c]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, 30)
Output[a, b,c,d,e]
SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, -30)
Output[]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -30, 30)
Output[a, b, c, d, e]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -30, -5)
Output[a]

SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 5, 30)
Output[e]
 
SELECT ARRAY_SLICE(['a', 'b', NULL, 'd', 'e'], 1, 3) 
Output[a, b, null]

SELECT ARRAY_SLICE(['a', 'b', NULL, 'd', 'e'], 0, 0) 
Output[a]
{code}
 

see also:
spark: [https://spark.apache.org/docs/latest/api/sql/index.html#slice]
google cloud: 
[https://cloud.google.com/spanner/docs/reference/standard-sql/array_functions#array_slice]
ClickHouse: 
[https://clickhouse.com/docs/en/sql-reference/functions/array-functions#arrayslice]
DockDb: [https://duckdb.org/docs/sql/functions/nested#list-functions]


> Add ARRAY_SLICE support in SQL & Table API
> ------------------------------------------
>
>                 Key: FLINK-32260
>                 URL: https://issues.apache.org/jira/browse/FLINK-32260
>             Project: Flink
>          Issue Type: Improvement
>          Components: Table SQL / Planner
>    Affects Versions: 1.18.0
>            Reporter: Bonnie Varghese
>            Assignee: Hanyu Zheng
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.18.0
>
>
> Implement the array_slice function to extract a subset of elements from an 
> array.
> This function returns a subset of the input array, starting from 
> 'start_offset' and ending at 'end_offset'. These offsets are 1-based and can 
> be positive (counted from the start of the array) or negative (counted from 
> the end of the array).
> Initially, the function checks if 'start_offset' or 'end_offset' are 0. If 
> so, they are treated as starting from the beginning of the input array.
> Next, the function checks if 'start_offset' is after 'end_offset' or if the 
> input array is empty. In such cases, it will return an empty array.
> For the remaining cases, the function proceeds as follows: if either 
> 'start_offset' or 'end_offset' exceed the array bounds, they are adjusted to 
> the size of the array. Conversely, if the absolute value of a negative 
> 'start_offset' or 'end_offset' is greater than the size of the array, the 
> corresponding offset is reset to the beginning of the array, which is 1.
> The function will return null if any input is null.
> Syntax:
>  
> code
> {code:java}
> ARRAY_SLICE(array, start_offset, end_offset){code}
> {{ }}
> Arguments:
> array: The array that contains the elements you want to slice.
> start_offset: The inclusive starting offset.
> end_offset: The inclusive ending offset.
> An offset can be positive or negative. A positive offset starts from the 
> beginning of the input array and is 1-based. A negative offset starts from 
> the end of the input array. Out-of-bounds offsets are supported. if 
> start_offset == 0 or end_offset == 0, we treat them start from the beginning 
> of the input array.
> Returns:
> The input array can contain NULL elements. NULL elements are included in the 
> resulting array.
> Returns NULL if array, start_offset, or end_offset is NULL.
> Returns an empty array if array is empty.
> Returns an empty array if the position of the start_offset in the array is 
> after the position of the end_offset.
> Examples:
>  
> {code:java}
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, 3)
> Output: [a, b, c]
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -1, -3)
> Output: []
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -3, -1)
> Output[c, d, e]
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 3, 3)
> Output[c]
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, 30)
> Output[a, b,c,d,e]
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 1, -30)
> Output[]
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -30, 30)
> Output[a, b, c, d, e]
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], -30, -5)
> Output[a]
> SELECT ARRAY_SLICE(['a', 'b', 'c', 'd', 'e'], 5, 30)
> Output[e]
>  
> SELECT ARRAY_SLICE(['a', 'b', NULL, 'd', 'e'], 1, 3) 
> Output[a, b, null]
> SELECT ARRAY_SLICE(['a', 'b', NULL, 'd', 'e'], 0, 0) 
> Output[a]
> {code}
>  
> see also:
> spark: [https://spark.apache.org/docs/latest/api/sql/index.html#slice]
> google cloud: 
> [https://cloud.google.com/spanner/docs/reference/standard-sql/array_functions#array_slice]
> ClickHouse: 
> [https://clickhouse.com/docs/en/sql-reference/functions/array-functions#arrayslice]
> DockDb: [https://duckdb.org/docs/sql/functions/nested#list-functions]



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to