4 Şubat 2021 Perşembe

JSON Functions and Operators

Ortak get/extract Operators
Açıklaması şöyle
There are six get/extract operators (accessors, and serializers) which work for both json and jsonb data types (“->”, “->>”, “#>”, “#>>”). Half of these (“->”, “#>”) return json, and other half return text (“->>”, “#>>”). Note that they return NULL if the JSON doesn’t have the right structure for the request.

These operators (also range and path operators) are used in a SELECT statement ...
Sadece Jsonb Operators
Açıklaması şöyle
There are also 12 additional operators that work for jsonb only (“@>”, “<@”, “?”, “?|”, “?&”, “||”, “-”, “#-”, “@?”, “@@”).
These include:
- Containment operators (“@>” and “<@”)
- Existence operators (“?”, “?|”, “?&”)
- Concatenation operator (“||”)
- Deletion operators (“-”, “#-”)
- Path checking operators (“@?”, “@@”).

The containment and path checking operators all return boolean results, while the other operators all return jsonb results.

Processing Functions
 JSON Processing Functions yazısına taşıdım

Aggregation
Açıklaması şöyle
There are also json specific aggregation functions ( json_agg etc), which allow you to aggregate (compute a single result from multiple inputs) other data types or json/jsonb into json/jsonb. You can also use standard aggregation functions after casting json to the correct type. 

1.  -> Select Key/Value Pair
Json'daki bir alanı çekmek için kullanılır. Key denilen şey tablodaki json/jsonb sütun ismi. Value denilen şey de Json'daki alan ismidir. Value değerine text olarak değil, kendi tipinde erişiriz.
Json'daki alan isimler F1 -> F2 -> F3 şeklinde fluent olarak kullanılabilir.

Örnek
Elimizde şöyle bir tablo olsun
CREATE TABLE LunchOrders(student_id INT, orders JSONB); 
Bu tabloya veri girelim. Json verisi tek tırnak içindedir.
INSERT INTO LunchOrders VALUES(100, '{
  "order_date": "2020-12-11",
  "order_details": {
    "cost": 4.25,
    "entree": ["pizza"],
    "sides": ["apple", "fries"],
    "snacks": ["chips"]}
  }'      
);

INSERT INTO LunchOrders VALUES(100, '{
  "order_date": "2020-12-12",
  "order_details": {
    "cost": 4.89,
    "entree": ["hamburger"],
    "sides": ["apple", "salad"],
    "snacks": ["cookie"]}
  }'      
);
Örnek
Sadece bir alanı sorgulamak için şöyle yaparız.
SELECT orders -> 'order_date' FROM lunchorders WHERE student_id = 100;
Örnek
İki alanı sorgulamak için şöyle yaparız. Burada order_details altındaki sides dizisi fluent olarak sorgulanıyor
SELECT orders -> 'order_date', orders-> 'order_details' -> 'sides'
  FROM lunchorders WHERE student_id = 100;
Eğer sides dizisinin ilk elemanını istersek şöyle yaparız
SELECT orders -> 'order_date', orders-> 'order_details' -> 'sides' -> 0
  FROM lunchorders WHERE student_id = 100;
2.  ->> Filter Query Results - Nesnenin Alanına Erişir WHERE Cümlesinde Kullanılabilir

4. #>> Filter Query Results In a Nested Object
Açıklaması şöyle
#>> operator that extracts the JSON sub-object at the specified path as text
Açıklaması şöyle
The jsonb_extract_path_text is a Postgres function that is equivalent to the  #>> operator
Şöyle yaparız
private EntityManager entityManager;

public List<Item> findAll(String expression) {
  return entityManager
    .createNativeQuery("SELECT * FROM item i WHERE " 
    + "i.jsonb_content#>>'{string_value}' LIKE '" 
    + expression + "'", Item.class)
    .getResultList();
}
Aynı şey SQL ile şöyledir
select item0_.jsonb_content as jsonb_co2_0_ 
from item item0_ 
where jsonb_extract_path_text(item0_.jsonb_content,?) like ?

5. @> Check If  an Object Contains a Value
WHERE cümlesinde Array tipler için kullanılır
Örnek
Şöyle yaparız
SELECT orders FROM lunchorders
  WHERE orders -> 'order_details' -> 'sides' @> '["salad"]'

orders
----------
{"order_date": "2020-12-12", "order_details": {"cost": 4.89, "sides": ["apple", "salad"],
"entree": ["hamburger"], "snacks": ["cookie"]}}
(1 row) 
Örnek
Şöyle yaparız.
SELECT * FROM books_data WHERE data @> '{"author" : "Mark Figueroa"}';





Hiç yorum yok:

Yorum Gönder