programing

Postgre에서 변수를 선언하는 방법SQL 쿼리

javamemo 2023. 4. 20. 19:41
반응형

Postgre에서 변수를 선언하는 방법SQL 쿼리

Postgre에서 사용할 변수를 선언하려면 어떻게 해야 합니까?SQL 8.3 쿼리?

MS SQL Server에서는 다음을 수행할 수 있습니다.

DECLARE @myvar INT
SET @myvar = 5

SELECT *
FROM somewhere
WHERE something = @myvar

PostgreSQL에서도 같은 작업을 하려면 어떻게 해야 하나요?문서변수에 따르면 단순히 "name type;"으로 선언되어 있는데, 이 경우 구문 오류가 발생합니다.

myvar INTEGER;

누가 저에게 올바른 구문의 예를 들어주실 수 있나요?

나는 한 조항을 사용해서 같은 목표를 달성했는데, 그것은 우아한 것과는 거리가 멀지만 같은 일을 할 수 있다.하지만 이 예에서는 정말 과잉 살상입니다.이것도 별로 추천하지 않아요.

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

Postgre에는 이러한 기능이 없습니다.SQL. pl/PgSQL(또는 기타 pl/*)에서만 수행할 수 있으며 일반 SQL에서는 수행할 수 없습니다.

는 있다WITH ()수 또는 """ "" " " " " " " " " " " " " " " " " " " " 。tuple값 표를 .임시 값 테이블을 반환할 수 있습니다.

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) > ...;

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;

위의 경우 Postgres 9.0 이후가 필요합니다.

동적 구성 설정

이것에 대해서, 다이나믹한 설정을 「유효하게」 할 수 있습니다.

-- 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;

Configuration 설정은 항상 varchar 값이기 때문에 사용할 때는 올바른 데이터 타입으로 캐스트해야 합니다.하지만 SQL 클라이언트에서는 동작합니다.\set에서만 기능하다psql

위의 경우 Postgres 9.2 이후가 필요합니다.

를 에 .postgresql.conf사용하기 전에 다소 사용성이 제한되었습니다.컨피규레이션 「class」를 설정합니다., 되면 어떤 라도 """를 변경하지 않고 할 수 .postgresql.conf

고객에 따라 다르죠.

, 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';

이 솔루션은 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)

에 '하다'를 사용할 수도 .SELECT * FROM constant_nameTABLE constant_namepostgresql과 수 .

pl/PgSQL 이외의 온도 테이블 사용

제안대로 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;

@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;

사실, 단일 값 변수를 선언하는 생생하고 명확한 방법은 없습니다. 할 수 있는 것은

with myVar as (select "any value really")

이 구성에 저장된 값에 액세스하려면

(select * from myVar)

예를들면

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

도구의 특수 기능을 사용할 수 있습니다.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);

다른 답변에서도 알 수 있듯이, Postgre.SQL에는 이 메커니즘이 없지만 이제 익명 블록을 사용할 수 있습니다.단, Common Table Expression(CTE; 공통 테이블 표현)에서도 다음과 같은 작업을 수행할 수 있습니다.

WITH vars AS (
    SELECT 5 AS myvar
)
SELECT *
FROM somewhere,vars
WHERE something = vars.myvar;

물론 원하는 만큼 변수를 가질 수 있으며 변수를 파생할 수도 있습니다.예를 들어 다음과 같습니다.

WITH vars AS (
    SELECT
        '1980-01-01'::date AS start,
        '1999-12-31'::date AS end,
        (SELECT avg(height) FROM customers) AS avg_height
)
SELECT *
FROM customers,vars
WHERE (dob BETWEEN vars.start AND vars.end) AND height<vars.avg_height;

프로세스는 다음과 같습니다.

  • CTE를 사용하여 합니다.SELECT없는 에서는 'Oracle'을 ).FROM DUAL를 참조해 주세요.
  • CTE를 다른 테이블과 교차 결합합니다.,가CROSS JOIN구문은 오래된 쉼표 구문이 조금 더 읽기 쉽습니다.
  • 위해서입니다.SELECT절을 클릭합니다. Postgre 구문을 했는데, 격식을 갖춘 SQL을 사용할 수 .CAST('1980-01-01' AS date)상호 호환성을 확보합니다.

일반적으로 교차 결합을 피하려고 하지만 단일 행만 교차 결합하므로 변수 데이터로 테이블을 넓히는 효과가 있습니다.

엔 굳이 안요.vars.이름이 다른 표의 이름과 충돌하지 않는 경우 접두사를 사용합니다.요점을 명확히 하기 위해 여기에 포함시켰습니다.

또한 CTE를 추가할 수도 있습니다.

이 기능은 변수를 지원하는 모든 최신 버전의 MSSQL 및 MySQL과 지원되지 않는 SQLite, 지원되지 않는 Oracle에서도 작동합니다.

다음은 PREPARE 문을 사용한 예입니다.아직 못 쓰시잖아요? , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , .$n★★★★★★★★★★★★★★★★★★:

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

DBeaver에서는 코드에서와 마찬가지로 쿼리에서 매개변수를 사용할 수 있으므로 다음과 같이 작동합니다.

SELECT *
FROM somewhere
WHERE something = :myvar

쿼리를 실행할 때 DBeaver는 :myvar 값을 요청하고 쿼리를 실행합니다.

포스트지 단말기의 플레인 변수를 사용한 코드 세그먼트를 다음에 나타냅니다.몇 번 써봤어요.하지만 더 나은 방법이 필요해여기에서는 문자열 변수를 사용하고 있습니다.정수 변수를 사용할 경우 세 개의 따옴표가 필요하지 않습니다.트리플 따옴표는 쿼리 시 단일 따옴표가 됩니다.그렇지 않으면 구문 오류가 발생합니다.문자열 변수를 사용할 때 세 개의 따옴표가 필요하지 않은 방법이 있을 수 있습니다.개선할 수 있는 방법이 있으면 업데이트해 주세요.

\set strainname '''B.1.1.7'''

select *
from covid19strain
where name = :strainname ;

psql 에서는, 이러한 「변수」를 매크로로서 사용할 수 있습니다.이러한 기능은 "설정"된 시간이 아니라 사용할 때마다 "평가"됩니다.

간단한 예:

\set my_random '(SELECT random())'
select :my_random;  -- gives  0.23330629315990592
select :my_random;  -- gives  0.67458399344433542

이것은 매번 두 가지 다른 답을 준다.

그러나 하위 선택 항목이 반복되지 않도록 하려면 이러한 항목을 유용한 약어로 사용할 수 있습니다.

\set the_id '(SELECT id FROM table_1 WHERE name = ''xxx'' LIMIT 1)'

나중에 쿼리에 사용할 수 있습니다.

:the_id 

예.

INSERT INTO table2 (table1_id,x,y,z) VALUES (:the_id, 1,2,3)

변수 내의 문자열은 이중 따옴표로 묶어야 합니다.이 경우 전체 항목이 쿼리에 문자열 인터폴레이션(즉, 매크로 확장)되기 때문입니다.

언급URL : https://stackoverflow.com/questions/1490942/how-to-declare-a-variable-in-a-postgresql-query

반응형