반응형

 

-  GPT의 도움을 받았습니다

-  카테고리는 code1 ~ code5 까지 있습니다.

  code1 필드값은 'cate' 로 통일합니다

  code2에 들어갈 데이터를 생성합니다

 

 

 

●   테이블 구조 (  POSTGRESQL  )

codeseq - INTEGER
code1 - VARCHAR(50)
code2 - VARCHAR(50)
code3 - VARCHAR(50)
code4 - VARCHAR(50)
code5 - VARCHAR(50)
codename - VARCHAR(50)
regdate - TIMESTAMP WITHOUT TIME ZONE
enableyn - VARCHAR(1)
voteyn - VARCHAR(1)
comment - VARCHAR(100)

 

 

●   결과값 먼저 확인하기

-- 쿼리 결과 미리 보기
WITH categories AS (
  SELECT unnest(ARRAY['반려동물', '야생동물', '수중생물', '조류', '파충류']) AS category,
         generate_series(1, 10) AS code2
)
SELECT 'cate' AS code1, 
       LPAD(code2::text, 2, '0') AS code2, 
       NULL AS code3, 
       category AS codename, 
       NOW() AS regdate, 
       'Y' AS enableyn, 
       'N' AS voteyn,
       category AS comment
FROM categories;

 

 

 

●  DB에 생성


-- 쿼리 결과 DB에 생성
WITH categories AS (
  SELECT unnest(ARRAY['반려동물', '야생동물', '수중생물', '조류', '파충류') AS category,
         generate_series(1, 10) AS code2
)
INSERT INTO t_code (code1, code2, code3, codename, regdate, enableyn, voteyn, comment)
SELECT 'cate', 
       LPAD(code2::text, 2, '0'), 
       NULL, 
       category, 
       NOW(), 
       'Y', 
       'N',
       category
FROM categories;

 

 

 

●  하위 카테고리 갯수 불러오기

CREATE OR REPLACE FUNCTION get_subcategory_count(
    p_code_1 VARCHAR(5),
    p_code_2 VARCHAR(5) DEFAULT NULL,
    p_code_3 VARCHAR(5) DEFAULT NULL,
    p_code_4 VARCHAR(5) DEFAULT NULL
)
RETURNS INTEGER AS $$
DECLARE
    v_count INTEGER;
    v_level INTEGER;
BEGIN
    -- 입력된 파라미터에 따라 레벨 결정
    IF p_code_4 IS NOT NULL AND p_code_4 != '' THEN
        v_level := 4;
    ELSIF p_code_3 IS NOT NULL AND p_code_3 != '' THEN
        v_level := 3;
    ELSIF p_code_2 IS NOT NULL AND p_code_2 != '' THEN
        v_level := 2;
    ELSE
        v_level := 1;
    END IF;

    -- 레벨에 따라 적절한 쿼리를 실행
    IF v_level = 1 THEN
        -- code1이 주어졌을 때 code2의 개수를 계산
        SELECT COUNT(DISTINCT code2)
        INTO v_count
        FROM t_code
        WHERE code1 = p_code_1 AND code2 IS NOT NULL AND code2 != '';
    ELSIF v_level = 2 THEN
        -- code2가 주어졌을 때 code3의 개수를 계산
        SELECT COUNT(DISTINCT code3)
        INTO v_count
        FROM t_code
        WHERE code1 = p_code_1 AND code2 = p_code_2 AND code3 IS NOT NULL AND code3 != '';
    ELSIF v_level = 3 THEN
        -- code3이 주어졌을 때 code4의 개수를 계산
        SELECT COUNT(DISTINCT code4)
        INTO v_count
        FROM t_code
        WHERE code1 = p_code_1 AND code2 = p_code_2 AND code3 = p_code_3 AND code4 IS NOT NULL AND code4 != '';
    ELSIF v_level = 4 THEN
        -- code4가 주어졌을 때 code5의 개수를 계산
        SELECT COUNT(DISTINCT code5)
        INTO v_count
        FROM t_code
        WHERE code1 = p_code_1 AND code2 = p_code_2 AND code3 = p_code_3 AND code4 = p_code_4 AND code5 IS NOT NULL AND code5 != '';
    END IF;

    RETURN v_count;
END;
$$
LANGUAGE plpgsql;

 

 

 

●  검색결과 쿼리

select *, get_subcategory_count('cate','','','') from t_code where code1='cate'   and code3 is null order by codeseq, code1, code2, code3;

 

반응형