[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.간단한, 짧은, 빠른 : 존재한다.
간단한, 짧은, 빠른 : 존재한다.
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.사용 수 (*)
사용 수 (*)
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 또는 뭔가를 사용할 필요가없는 곳. 그것은이를 테스트 할 수있는 효과적인 방법입니다.
from https://stackoverflow.com/questions/11892233/pl-pgsql-checking-if-a-row-exists by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 오라클 - ORA-01489가 : 문자열 연결의 결과가 너무 오래입니다 [중복] (0) | 2020.04.11 |
---|---|
[SQL] 어떻게 재귀에서 데이터베이스 트리거를 방지합니까? (0) | 2020.04.11 |
[SQL] 오라클 - 분할 다중 콤마 여러 행 Oracle 테이블의 값을 구분 (0) | 2020.04.11 |
[SQL] 두 개의 열을 기준으로 열을 동적으로 변환 행에 MySQL의 쿼리 (0) | 2020.04.11 |
[SQL] 점검 제한 조건은 다른 테이블에 관련된 수 있습니까? (0) | 2020.04.11 |