복붙노트

[SQL] 행이 존재하는지 확인하는 PL / pgSQL의

SQL

행이 존재하는지 확인하는 PL / pgSQL의

나는 PL / pgSQL의에서 함수를 쓰고 있어요, 나는 행이 존재하는지 확인하는 가장 간단한 방법을 찾고 있어요. 지금은 정말 작동하지 않습니다 부울로 정수를 선택하고있다. 나는이 일을하는 가장 좋은 방법을 알고 아직 충분히 PL / pgSQL의 경험이 아니에요.

여기 내 기능의 일부는 다음과 같습니다

DECLARE person_exists boolean;
BEGIN

person_exists := FALSE;

SELECT "person_id" INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists THEN
  -- Do something
END IF;

END; $$ LANGUAGE plpgsql;

업데이트 - 지금이 뭔가를하고 있어요 :

DECLARE person_exists integer;
BEGIN

person_exists := 0;

SELECT count("person_id") INTO person_exists
  FROM "people" p
WHERE p.person_id = my_person_id
LIMIT 1;

IF person_exists < 1 THEN
  -- Do something
END IF;

해결법

  1. ==============================

    1.간단한, 짧은, 빠른 : 존재한다.

    간단한, 짧은, 빠른 : 존재한다.

    IF EXISTS (SELECT 1 FROM people p WHERE p.person_id = my_person_id) THEN
      -- do something
    END IF;
    

    첫 번째 행에서 중지 할 수 있습니다 쿼리 플래너 발견 -에 관계없이 일치하는 모든 행을 스캔하는 () 계산에 반대. 큰 테이블과 차이가 있습니다. 거의 유일한 컬럼에 대한 조건 문제 없다 - 한 행 어쨌든 자격 (을 신속하게 찾아 볼 수있는 인덱스가있다).

    아래의 코멘트에 @a_horse_with_no_name의 의견을 향상.

    당신은 빈 SELECT 목록을 사용할 수 있습니다 :

    IF EXISTS (SELECT FROM people p WHERE p.person_id = my_person_id) THEN ...
    

    SELECT 목록이 결과에 관련이 아니므로 존재합니다. 적어도 하나 개의 자격을 갖춘 행 문제 만 존재.

  2. ==============================

    2.사용 수 (*)

    사용 수 (*)

    declare 
       cnt integer;
    begin
      SELECT count(*) INTO cnt
      FROM people
      WHERE person_id = my_person_id;
    
    IF cnt > 0 THEN
      -- Do something
    END IF;
    

    (비슷한 일을 할 수있는 문 등을 읽을하지 않은 downvoter에 대한) 편집

    열에 where 절 있기 때문에이 솔루션은에만 유효 (및 컬럼의 이름이 암시 자사의 기본 키 - FROM 절은 매우 효과적입니다 그래서)

    때문에 절은 기본 키에 의해 식별되는 행의 존재를 테스트하기 위해 LIMIT 또는 뭔가를 사용할 필요가없는 곳. 그것은이를 테스트 할 수있는 효과적인 방법입니다.

  3. from https://stackoverflow.com/questions/11892233/pl-pgsql-checking-if-a-row-exists by cc-by-sa and MIT license