feat: Support SQL
Struct/JSON field access operators
#17226
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Builds on #17109, which added support for querying into Struct fields using dot-notation.
This PR extends that by adding the PostgreSQL operator equivalents1.
Can use for both array and field indexing.
->
Extract value at key/index.->>
Extract value at key/index as a string.#>
Extract value at specified path, where path elements can be keys or indexes.#>>
Extract value at specified path, where path elements can be keys or indexes, as a string.Note
Unlike standard array-indexing in PostgreSQL, which is 1-indexed, these operators expect 0-indexing as they follow JSON conventions, so the following two queries are equivalent (and both now parse):
df.sql('SELECT nested."0"[1] FROM self')
df.sql("SELECT nested -> '0' -> 0 FROM self")
"Yay for consistency within SQL statements" 🙄
Examples
Index into struct fields with operators:
Footnotes
See: https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-JSON-PROCESSING. ↩