복붙노트

[SQL] PostgreSQL의 쿼리에 변수를 선언하는 방법

SQL

PostgreSQL의 쿼리에 변수를 선언하는 방법

어떻게 PostgreSQL의 8.3 쿼리에 사용할 수있는 변수를 선언합니까?

에서 MS SQL 서버 나는이 작업을 수행 할 수 있습니다

DECLARE @myvar INT
SET @myvar = 5

SELECT *
FROM somewhere
WHERE something = @myvar

어떻게 PostgreSQL의에서 동일한 작업을 수행합니까? : 그러나 이것은 나에게 구문 오류가 있습니다; "이름 유형"변수는 단순히 선언 된 문서에 따르면,

myvar INTEGER;

누군가가 나에게 올바른 구문의 예를 들어 줄 수 있을까?

해결법

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

    1.PostgreSQL의에서 그런 기능이 없다. 당신은 할 수 그것은 단지에서 PL / pgSQL의 (또는 다른 PL / *)가 아닌 일반 SQL있다.

    PostgreSQL의에서 그런 기능이 없다. 당신은 할 수 그것은 단지에서 PL / pgSQL의 (또는 다른 PL / *)가 아닌 일반 SQL있다.

    예외 변수 또는 변수에도 튜플 일 수 () 쿼리이다. 그것은 당신이 임시 값의 테이블을 반환 할 수 있습니다.

    WITH master_user AS (
        SELECT
          login,
          registration_date
        FROM users
        WHERE ...
    )
    
    SELECT *
    FROM users
    WHERE master_login = (SELECT login
                          FROM master_user)
          AND (SELECT registration_date
               FROM master_user) > ...;
    
  2. ==============================

    2.나는 WITH 절을 사용하여 같은 목표를 달성, 그것은 우아한로 갑자기 근처의하지만 같은 일을 할 수 있습니다. 이 예를 들어 있지만 정말 잔인한 사람입니다. 나는 또한 특히이 사용하지 않는 것이 좋습니다.

    나는 WITH 절을 사용하여 같은 목표를 달성, 그것은 우아한로 갑자기 근처의하지만 같은 일을 할 수 있습니다. 이 예를 들어 있지만 정말 잔인한 사람입니다. 나는 또한 특히이 사용하지 않는 것이 좋습니다.

    WITH myconstants (var1, var2) as (
       values (5, 'foo')
    )
    SELECT *
    FROM somewhere, myconstants
    WHERE something = var1
       OR something_else = var2;
    
  3. ==============================

    3.또한 PLPGSQL이 시도해 볼 수도 있습니다 :

    또한 PLPGSQL이 시도해 볼 수도 있습니다 :

    DO $$
    DECLARE myvar integer;
    BEGIN
        SELECT 5 INTO myvar;
    
        DROP TABLE IF EXISTS tmp_table;
        CREATE TABLE tmp_table AS
        SELECT * FROM yourtable WHERE   id = myvar;
    END $$;
    
    SELECT * FROM tmp_table;
    

    위는 포스트 그레스 9.0 이상이 필요합니다.

  4. ==============================

    4.그것은 당신의 클라이언트에 따라 달라집니다.

    그것은 당신의 클라이언트에 따라 달라집니다.

    당신은 psql의 클라이언트를 사용하는 경우, 당신은 다음을 사용할 수 있습니다 :

    my_db=> \set myvar 5
    my_db=> SELECT :myvar  + 1 AS my_var_plus_1;
     my_var_plus_1 
    ---------------
                 6
    

    텍스트 변수를 사용하는 경우는 인용 할 필요가있다.

    \set myvar 'sometextvalue'
    select * from sometable where name = :'myvar';
    
  5. ==============================

    5.당신이 위해 할 수있는 "학대"동적 구성 설정 :

    당신이 위해 할 수있는 "학대"동적 구성 설정 :

    -- choose some prefix that is unlikely to be used by postgres
    set session my.vars.id = '1';
    
    select *
    from person 
    where id = current_setting('my.vars.id')::int;
    

    당신이 그들을 사용할 때 올바른 데이터 형식에 캐스팅 할 필요가 있도록 구성 설정은 항상 VARCHAR 값입니다. 어떤 SQL 클라이언트와이 작품 \ 세트는 psql의 작동 반면,

    위는 포스트 그레스 9.2 이상이 필요합니다.

    이전 버전의 경우, 변수 때문에 다소의 유용성을 제한, 사용하기 전에 postgresql.conf의 선언되어야했다. 실제로 완전하게 변수지만, 본질적으로 접두사 인 설정 "클래스". 접두사를 정의하지만, 일단 모든 변수는 postgresql.conf의 변경없이 사용할 수

  6. ==============================

    6.제안 PL / pgSQL의 다른 PL / * 언어를 사용하는 외부, 이것은 내가 생각할 수있는 유일한 가능성이다.

    제안 PL / pgSQL의 다른 PL / * 언어를 사용하는 외부, 이것은 내가 생각할 수있는 유일한 가능성이다.

    begin;
    select 5::int as var into temp table myvar;
    select *
      from somewhere s, myvar v
     where s.something = v.var;
    commit;
    
  7. ==============================

    7.나는 그것을 간단하게 활용하여 임시 테이블을 만들기 위해, DarioBarrionuevo의 대답 @에 개선을 제안하고 싶다.

    나는 그것을 간단하게 활용하여 임시 테이블을 만들기 위해, DarioBarrionuevo의 대답 @에 개선을 제안하고 싶다.

    DO $$
        DECLARE myvar integer = 5;
    BEGIN
        CREATE TEMP TABLE tmp_table ON COMMIT DROP AS
            -- put here your query with variables:
            SELECT * 
            FROM yourtable
            WHERE id = myvar;
    END $$;
    
    SELECT * FROM tmp_table;
    
  8. ==============================

    8.이 솔루션은 fei0x에 의해 제안 된 하나를 기반으로하지만, 쉽게 쿼리의 시작 부분에 나열 할 수 쿼리 상수와 상수의 값리스트에 가입 할 필요가 없다는 장점을 가지고있다. 또한 재귀 쿼리에서 작동합니다.

    이 솔루션은 fei0x에 의해 제안 된 하나를 기반으로하지만, 쉽게 쿼리의 시작 부분에 나열 할 수 쿼리 상수와 상수의 값리스트에 가입 할 필요가 없다는 장점을 가지고있다. 또한 재귀 쿼리에서 작동합니다.

    기본적으로, 모든 일정은 다음 쿼리의 나머지 부분에 어디서든 호출 할 수 WITH 절에서 선언 한 값 테이블입니다.

    WITH
        constant_1_str AS (VALUES ('Hello World')),
        constant_2_int AS (VALUES (100))
    SELECT *
    FROM some_table
    WHERE table_column = (table constant_1_str)
    LIMIT (table constant_2_int)
    

    또는 당신은 PostgreSQL 대신에 다른 다른 쿼리 언어에 대한 유효하지 않을 수 표 constant_name의 constant_name로부터 SELECT *를 사용할 수 있습니다.

  9. ==============================

    9.여기에 문을 PREPARE 사용 예입니다. ? 당신은 여전히 ​​사용할 수 없습니다,하지만 당신은 $ N 표기법을 사용할 수 있습니다 :

    여기에 문을 PREPARE 사용 예입니다. ? 당신은 여전히 ​​사용할 수 없습니다,하지만 당신은 $ N 표기법을 사용할 수 있습니다 :

    PREPARE foo(integer) AS
        SELECT  *
        FROM    somewhere
        WHERE   something = $1;
    EXECUTE foo(5);
    DEALLOCATE foo;
    
  10. ==============================

    10.사실, 단일 값 변수를 선언 할 선명하고 명확한 방법이, 당신이 할 수있는 일입니다입니다

    사실, 단일 값 변수를 선언 할 선명하고 명확한 방법이, 당신이 할 수있는 일입니다입니다

    with myVar as (select "any value really")
    

    다음,이 구조에 저장된 값에 액세스하려면, 당신이 할

    (select * from myVar)
    

    예를 들면

    with var as (select 123)    
    ... where id = (select * from var)
    
  11. ==============================

    11.당신은 도구의 특별한 기능에 의존 할 수있다. DBeaver에 대한처럼 독자적인 문법을 가지고 :

    당신은 도구의 특별한 기능에 의존 할 수있다. DBeaver에 대한처럼 독자적인 문법을 가지고 :

    @set name = 'me'
    SELECT :name;
    SELECT ${name};
    
    DELETE FROM book b
    WHERE b.author_id IN (SELECT a.id FROM author AS a WHERE a.name = :name);
    
  12. ==============================

    12.이 작업을 할 수 있도록 DBeaver에서 당신은, 당신이 코드에서 할 수처럼 쿼리에서 매개 변수를 사용할 수 있습니다 :

    이 작업을 할 수 있도록 DBeaver에서 당신은, 당신이 코드에서 할 수처럼 쿼리에서 매개 변수를 사용할 수 있습니다 :

    SELECT *
    FROM somewhere
    WHERE something = :myvar
    

    쿼리를 실행할 때 DBeaver는 값를 묻습니다 : myVar에 쿼리를 실행합니다.

  13. from https://stackoverflow.com/questions/1490942/how-to-declare-a-variable-in-a-postgresql-query by cc-by-sa and MIT license