Extract all values from a PostgreSQL JSON array given a key - json

How exctract from json in postgres
[{"val":"2","dsk:"one"},{"val":"2","dsk":"two"},{"val":"3","dsk":"three"}]
where dsk values
It return null values
SELECT '[{"val":"2","dsk:"one"},{"val":"2","dsk":"two"},{"val":"3","dsk":"three"}]'::json->'dsk'

You can use the jsonb_path_query_array function and extract the entire value from the array
select jsonb_path_query_array('[{"val":"2","dsk":"one"},{"val":"2","dsk":"two"},{"val":"3","dsk":"three"}]','$[*].dsk')
Demo in DBfiddle

As mentioned you cannot use your approach because it is an array, but you can try a different one with a json function:
WITH data
AS (
SELECT *
FROM json_array_elements('[{"val":"2","dsk":"one"},{"val":"2","dsk":"two"},{"val":"3","dsk":"three"}]'::json)
)
SELECT value->'dsk'
FROM data

Related

Check if boolean value present in nested object

I have a JSON column and the data stored looks like:
{"results":{"made":true,"cooked":true,"eaten":true}}
{"results":{"made":true,"cooked":true,"eaten":false}}
{"results":{"made":true,"eaten":true,"a":false,"b":true,"c":false}, "more": {"ignore":true}}
I need to find all rows where 1+ values in $.results is false.
I tried using JSON_CONTAINS() but didn't find a way to get it to compare to a boolean JSON value, or to look at all values in $.results.
This needs to work with MySQL 5.7 but if it's not possible I will accept a MySQL 8+ answer.
I don't know the way for to search for a JSON true/false/null value using JSON functions - in practice these values are treated as string-type values during the search with JSON_CONTAINS, JSON_SEARCH, etc.
Use regular expression for the checking. Something like
SELECT id,
JSON_PRETTY(jsondata)
FROM test
WHERE jsondata REGEXP '"results": {[^}]+: false.*}';
DEMO
You could simply search the JSON_EXTRACT using the LIKE condition this way.
SELECT * FROM table1 WHERE JSON_EXTRACT(json_dict, '$.results') LIKE '%: false%';
Check this DB FIDDLE
An alternative to the pattern matching in other answers, is to extract all values from $.results and check each entry with a helper table with running numbers
SELECT DISTINCT v.id, v.json_value
FROM (
SELECT id, json_value, JSON_EXTRACT(json_value, '$.results.*') value_array
FROM json_table
) v
JOIN seq ON seq.n < JSON_LENGTH(v.value_array)
WHERE JSON_EXTRACT(v.value_array, CONCAT('$[', seq.n, ']')) = false
Here is the demo

How to extract a value from JSON that repeats multiple times?

I have the following table:
I need to create a select that returns me something like this:
I have tried this code:
SELECT Code, json_extract_path(Registers::json,'sales', 'name')
FROM tbl_registers
The previous code returns me a NULL in json_extract_path, I have tried the operator ::json->'sales'->>'name', but doesn't work too.
You need to unnest the array, and the aggregate the names back. This can be done using json_array_elements with a scalar sub-query:
select code,
(select string_agg(e ->> 'name', ',')
from json_array_elements(t.products) as x(e)) as products
from tbl_registers t;
I would also strongly recommend to change your column's type to jsonb
step-by-step demo:db<>fiddle
SELECT
code,
string_agg( -- 3
elems ->> 'name', -- 2
','
) as products
FROM tbl_registers,
json_array_elements(products::json) as elems -- 1
GROUP BY code
If you have type text (strictly not recommended, please use appropriate data type json or jsonb), then you need to cast it into type json (I guess you have type text because you do the cast already in your example code). Afterwards you need to extract the array elements into one row per element
Fetch the name value
Reaggregate by grouping and use string_agg() to create the string list

How to check if the value of key is ARRAY or STRUCT in BigQuery

I am trying to extract values from JSON object but I don't know if the value is Array or an Object as i want to write a generic code that will check array or object and return value accordingly.
I have two JSON as below
JSON one:
"fruit":[{"apples":5,"oranges":10},{"apples":2,"oranges":4}]
JSON two:
"fruit":{"apples":5,"oranges":10}
I have to get value of oranges but the value of fruit may change.
How to check type of value and extract value in BigQuery?
Consider below
#standardSQL
with `project.dataset.table` as (
select 1 id, '{"fruit":[{"apples":5,"oranges":10},{"apples":2,"oranges":4}]}' json union all
select 2, '{"fruit":{"apples":5,"oranges":10}}'
)
select id,
json_extract(x, '$.apples') apples,
json_extract(x, '$.oranges') oranges
from `project.dataset.table`,
unnest(ifnull(json_extract_array(json, '$.fruit'), [json_extract(json, '$.fruit')])) x
with output

How can I pass array of tuples to sql statement using json

I’m trying to make the following sql statement in a json file:
SELECT user_id
FROM users_to_users
WHERE (user_id, contact_user_id, contact_blocked) IN ?
I tried providing an array of arrays for the ? Values but that returned an error. Is there a way with json to pass an array of tuples for the inserts in the above sql statement?
Simple Example:-
Use the FIND_IN_SET function:
SELECT t.*
FROM YOUR_TABLE t
WHERE FIND_IN_SET(3, t.ids) > 0
-- all books with tags starting 'Java':
SELECT * FROM `book`
WHERE JSON_SEARCH(tags, 'one', 'Java%') IS NOT NULL;
Check This Reference which uses JSON To see the whole possible Solutions
Reference Of FIND_IN_SET Answer

can I compare with where two entire json values?

I have a JSON field in the stadiums table (mysql) named location, can i compare it with another json like below?...
select *from stadiums where location = '{"lat":40, "lng":3}';
*The query doesnt return me any error, but doesnt return me any row when there is in fact a coincidence
You can use CAST() function:
SELECT * FROM stadiums WHERE location = CAST('{"lat":40, "lng":3}' AS JSON);
MySQL has JSON_SEARCH JSON_CONTAINS JSON_EXTRACT functions that you can use to search JSON fields.
Try something like:
select * from stadiums where
JSON_EXTRACT(location, '$.lat') = 40 and
JSON_EXTRACT(location, '$.lng') = 3;