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_name
TABLE constant_name
postgresql과 수 .
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
'programing' 카테고리의 다른 글
목록을 C#의 문자열로 변환합니다. (0) | 2023.04.25 |
---|---|
mongoose 스키마에 중첩된 개체 (0) | 2023.04.20 |
nodemon이 작동하지 않음: -syslog: nodemon: 명령을 찾을 수 없습니다. (0) | 2023.04.20 |
VBA(excel)의 행을 루프하는 가장 효율적이고 빠른 방법은 무엇입니까? (0) | 2023.04.20 |
열이 수정된 경우에만 SQL 업데이트 트리거 (0) | 2023.04.20 |