Nice programing

PostgreSQL IF 문

nicepro 2020. 12. 10. 21:06
반응형

PostgreSQL IF 문


Postgres에서 이러한 쿼리를 어떻게 수행 할 수 있습니까?

IF (select count(*) from orders) > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);

시험:

DO
$do$
BEGIN
IF EXISTS (SELECT FROM orders) THEN
   DELETE FROM orders;
ELSE 
   INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$

주요 포인트

  • 표준 SQL에는 절차 적 요소가 없습니다. IF명령문 은 기본 절차 언어 PL / pgSQL의 일부입니다. 함수를 만들거나 DO명령을 사용하여 임시 문을 실행해야합니다 .

  • 당신은 필요 ;(plpgsql에서 각 문장의 끝에서 마지막을 제외하고END ).

  • 진술 END IF;끝에 필요 IF합니다.

  • 하위 선택은 괄호로 묶어야합니다.

    IF (SELECT count(*) FROM orders) > 0 ...
    

    또는:

    IF (SELECT count(*) > 0 FROM orders) ...
    

    그러나 이것은 동등하고 훨씬 빠릅니다.

    IF EXISTS (SELECT FROM orders) ...
    

대안

SELECT여기 에는 실제로 추가가 필요하지 않습니다 . 이것은 동일하고 조금 더 빠릅니다.

DO
$do$
BEGIN
DELETE FROM orders;
IF NOT FOUND THEN
   INSERT INTO orders VALUES (1,2,3);
END IF;
END
$do$

가능성은 낮지 만 동일한 테이블에 쓰기를 시도하는 동시 트랜잭션이 방해를받을 수 있습니다. 확실히하려면 설명 된대로 진행하기 전에 동일한 트랜잭션에서 테이블을 쓰기 잠금 하십시오.


저와 같은 질문에 우연히 발견 한 사람이 있으면 도움을주기 위해 PostgreSQL에서 if를 사용하려면 "CASE"를 사용합니다.

select 
    case
        when stage = 1 then 'running'
        when stage = 2 then 'done'
        when stage = 3 then 'stopped'
    else 
        'not running'
    end as run_status from processes

로부터 문서

IF boolean-expression THEN
    statements
ELSE
    statements
END IF;

따라서 위의 예에서 코드는 다음과 같아야합니다.

IF select count(*) from orders > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
END IF;

누락되었습니다 : END IF;


익명 코드 블록 프로 시저 블록 과 함께 PL / pgSQL CASE의 기본 구조를 사용할 수도 있습니다 .

DO $$ BEGIN
    CASE
        WHEN boolean-expression THEN
          statements;
        WHEN boolean-expression THEN
          statements;
        ...
        ELSE
          statements;
    END CASE;
END $$;

참조 :

  1. http://www.postgresql.org/docs/current/static/sql-do.html
  2. https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html

참고URL : https://stackoverflow.com/questions/11299037/postgresql-if-statement

반응형