반응형
각각 DB에는 장단점이 있는 것처럼 ... postgreSql 에서는 변수 사용이 복잡하다.
MariaDB 는 SET 변수명 으로 간단하게 선언이 가능한데 .. (보러가기 클릭)
PostgreSQL 은 그렇지 않다.
콘솔 변수 사용방법
여러가지 방법이 있지만, 그나마 간단해 보이는 with 임시 테이블을 사용하는 방법을 설명하겠다.
with 변수 as (
select '값' as 변수명
select 'skylar' as vName
)
select *
from 테이블명
where member_name = (select vName from 변수);
WITH 사용 예시
실제 사용 사례는 다음과 같다.
with 변수 as (
select '2411020001' as vGroup_id
)
, this_week AS (
select * from sg_assigncycle
where group_id = (select vGroup_id from 변수)
and now() between date(startdate) and date(enddate)
)
select A.user_id
, B.penalty
, count(*) AS log_count
, B.penalty > count(*) AS penalty_chk
from studylogs A
left join studygroup B
on A.group_id = B.group_id
left join this_week C
on C.group_id = A.group_id
where A.create_date between date(C.startdate) AND date(C.enddate)
group by user_id, B.penalty, C.assigncycle
아 적고보니까 안 간단한듯 .... ㅋㅋ
DECLARE 보다는 간단하고 보기 편하다고 생각되는데 .. 복잡해지면 얘기가 달라질 수 도 있겠다.
DECLARE 사용 예시
DO $$
DECLARE
vGroup_id VARCHAR := '2411020001'; -- 또는 TEXT
BEGIN
EXECUTE format('
WITH temp_date AS (
SELECT * FROM sg_assigncycle
WHERE group_id = %L
AND now() BETWEEN date(startdate) AND date(enddate)
)
SELECT A.user_id,
B.penalty,
COUNT(*) AS log_count,
B.penalty > COUNT(*) AS penalty_chk
FROM studylogs A
LEFT JOIN studygroup B ON A.group_id = B.group_id
LEFT JOIN temp_date C ON C.group_id = A.group_id
WHERE A.create_date BETWEEN date(C.startdate) AND date(C.enddate)
GROUP BY user_id, B.penalty, C.assigncycle
', vGroup_id);
END $$;
반응형