
https://velog.io/@jimmmmmm/postgresql-plsql-json-jsonb%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%B0%B0%EC%97%B4-map%EC%82%AC%EC%9A%A9
기존의 jsonb를 사용한 map방식의 단점이 존재했다.
json_data := jsonb_set(json_data::jsonb, '{name}', '"David"'::jsonb)::json;
json_data := jsonb_set(json_data::jsonb, '{age}', '21'::jsonb)::json;
json_data := jsonb_set(json_data::jsonb, '{city}', '"San Francisco"'::jsonb)::json;
위와 같은 형태로 입출력시 너무 긴 문구, 떨어지는 가독성 등이 문제였다.
기존이 위의 방식 대신
RECORD라는 변수를 사용했는데. map형태로 호출하려면 select * form ... into record처럼 조회했을 때 외엔 key값으로 호출이 안된다고 생각(틀렸다)했고, 무엇보다 GPT가 안내해주지 못했다. 무엇보다 계산값을 저장하고 싶을 땐 불가능하다는 점이 큰 단점이였는데. 이를 해결했다.
select min(now_time) as now_time
, sum(price) as price
, sum(count) as count
from sum_table
group by now_time
into rowData;
간단한 셀렉트의 into에 RECORD를 입력한 형태다. 지금 저 2개의 데이터가 rowData에 삽입되어있고 기본 출력시 RAISE NOTICE(를 사용한다면)
("2024-10-01 00:00:00",2000, 5)
위와 같이 출력된다.
이를 key : value 형태로 출력하고 싶다면
RAISE NOTICE 'Record rowData: %', ROW_TO_JSON(rowData);
식으로 출력하면 된다 결과값은
("now_time":"2024-10-01 00:00:00", "price":2000,"count":5)
대망의 계산값 입력이다. 여지껏 테이블 조회 할 때만 받아올 수 있다고 생각하여 jsonb를 사용했었고 cht-gpt도 그렇게 안내되고 있어서 사용하지 못하였지만 사용할 수 있는 방법을 찾아냈다.
select rowData.price + rowData.count as tot_price into calcData;
위의 코드에서는 select문이 시작되어 sql로 보이지만 from table과 그 이하 요소가 없다. 즉 위에서 받아온 요소안에서 계산만하고 as를 통해 key값을 정해주면 해당 key값으로 calcData에 입력이 된다.
매번 jsob의 -->>{}()하는 구문이 사라져 훨씬 간결하게 사용 할 수 있다.