복붙노트

[SQL] 당신은 어떻게 psql의에서 스크립트 변수를 사용합니까?

SQL

당신은 어떻게 psql의에서 스크립트 변수를 사용합니까?

MS SQL Server에서 나는 사용자 정의 변수를 사용하는 내 스크립트를 만들 :

DECLARE @somevariable int  
SELECT @somevariable = -1

INSERT INTO foo VALUES ( @somevariable )

그때 내가 특정 상황에서 원하는 값에 따라, 런타임에 @somevariable의 값을 변경할 수 있습니다. 이 스크립트의 상단이기 때문에 그것을보고 기억하기 쉽다.

어떻게 PostgreSQL의 클라이언트 psql의와 동일한 작업을 수행합니까?

해결법

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

    1.포스트 그레스 변수는 예를 들어, \ 집합 명령을 통해 생성되는 ...

    포스트 그레스 변수는 예를 들어, \ 집합 명령을 통해 생성되는 ...

    \set myvariable value
    

    ... 다음으로, 예를 들면 치환 될 수있다 ..

    SELECT * FROM :myvariable.table1;
    

    ... 또는 ...

    SELECT * FROM table1 WHERE :myvariable IS NULL;
    

    편집 : psql를 9.1로, 변수와 같이 따옴표로 확장 할 수 있습니다 :

    \set myvariable value 
    
    SELECT * FROM table1 WHERE column1 = :'myvariable';
    

    psql의 클라이언트의 이전 버전에서 :

    ... 당신은 같은 조건 문자열 쿼리의 값으로 변수를 사용하려면 ...

    SELECT * FROM table1 WHERE column1 = ':myvariable';
    

    ... 당신은 위의하지 않습니다 작품으로 변수 자체에 따옴표를 포함해야합니다. 대신 같은 당신의 변수를 정의 ...

    \set myvariable 'value'
    

    나처럼, 당신은 당신이 기존 변수에서 문자열을 만들고 싶어하는 상황에 달렸다, 그러나, 나는이 일을 트릭을 발견 ...

    \set quoted_myvariable '\'' :myvariable '\''
    

    지금 당신은 동일한 문자열의 인용과 인용 부호로 둘러싸이지 않은 변수 모두있다! 그리고 당신은 이런 식으로 뭔가를 할 수 ....

    INSERT INTO :myvariable.table1 SELECT * FROM table2 WHERE column1 = :quoted_myvariable;
    
  2. ==============================

    2.PSQL 변수에 마지막으로 단어 :

    PSQL 변수에 마지막으로 단어 :

  3. ==============================

    3.당신은이 절을 사용하려고 할 수 있습니다.

    당신은이 절을 사용하려고 할 수 있습니다.

    WITH vars AS (SELECT 42 AS answer, 3.14 AS appr_pi)
    SELECT t.*, vars.answer, t.radius*vars.appr_pi
    FROM table AS t, vars;
    
  4. ==============================

    4.특히 psql를 들어, 당신도 명령 줄에서 psql의 변수를 전달할 수 있습니다; 당신은 -v로 전달할 수 있습니다. 다음은 사용 예는 다음과 같습니다

    특히 psql를 들어, 당신도 명령 줄에서 psql의 변수를 전달할 수 있습니다; 당신은 -v로 전달할 수 있습니다. 다음은 사용 예는 다음과 같습니다

    $ psql -v filepath=/path/to/my/directory/mydatafile.data regress
    regress=> SELECT :'filepath';
                   ?column?                
    ---------------------------------------
     /path/to/my/directory/mydatafile.data
    (1 row)
    

    콜론 인용되지 않은 것을 참고, 다음 변수 이름 자체가 인용된다. 홀수 구문, 나는 알고있다. 이것은 단지 psql의 작동; 그것은 (말) PgAdmin-III에서 작동하지 않습니다.

    세션의 세션 변화 '파일 경로': '파일 경로'과의 값을 기대 : 당신이 (말)가 사용하는 것을 함수를 정의 할 수 있도록이 대체는, psql의에서 입력을 처리하는 동안 발생합니다. 이 함수를 정의 할 때, 회 치환 될 것이고, 그 후 일정하게 유지된다. 이 스크립트에 대한 유용하지만, 런타임 사용할 수 없습니다.

  5. ==============================

    5.FWIW는, 진짜 문제는 내가 내 \ 세트 명령의 끝에 세미콜론을 포함했다고했다 :

    FWIW는, 진짜 문제는 내가 내 \ 세트 명령의 끝에 세미콜론을 포함했다고했다 :

    세미콜론은 변수의 실제 문자로 해석했다 :

    내가 그것을 사용하려고 할 때 그래서 :

    ...알 겠어:

    단지 문자 주위에 따옴표를 설정할 수 있지만이 개 부분 (는 "NOINHERIT"시작으로 유효의 두 번째)에 명령을 분할하는 데 실패하지 않는 것이.

    다음은이 이야기의 도덕적 : PostgreSQL의 "변수"정말 텍스트 확장, 사실이 아니다 값에 사용되는 매크로입니다. 나는 유용 확신 해요,하지만 처음에는 까다로운.

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

    6.당신은 PL / pgSQL의가 아닌 SQL의 PROC의 언어와 절차 적 언어 중 하나를 사용해야합니다. PL / pgSQL의에서 수행 할 수 있습니다 사용은 바로 SQL 문에 바르. 작은 따옴표를 들어 당신은 인용 문자 기능을 사용할 수 있습니다.

    당신은 PL / pgSQL의가 아닌 SQL의 PROC의 언어와 절차 적 언어 중 하나를 사용해야합니다. PL / pgSQL의에서 수행 할 수 있습니다 사용은 바로 SQL 문에 바르. 작은 따옴표를 들어 당신은 인용 문자 기능을 사용할 수 있습니다.

  7. ==============================

    7.지원되는 서버 측 스크립트 언어의에서 포스트 그레스 (버전 9.0 이후) 허용 익명 블록

    지원되는 서버 측 스크립트 언어의에서 포스트 그레스 (버전 9.0 이후) 허용 익명 블록

    DO '
    DECLARE somevariable int = -1;
    BEGIN
    INSERT INTO foo VALUES ( somevariable );
    END
    ' ;
    

    http://www.postgresql.org/docs/current/static/sql-do.html

    모든 문자열 내부로 외부 문자열 변수는 의지를 필요로 대체되고 두 번 탈출을 인용 할 수 있습니다. 대신 달러 인용 부호를 사용하여 SQL 인젝션에 대한 완전한 보호를 제공하지 않습니다.

  8. ==============================

    8.또 다른 방법은 (AB) 변수를 생성하기 위해 PostgreSQL의 GUC 메커니즘을 사용하는 것입니다. 자세한 내용과 예제이 이전 답변을 참조하십시오.

    또 다른 방법은 (AB) 변수를 생성하기 위해 PostgreSQL의 GUC 메커니즘을 사용하는 것입니다. 자세한 내용과 예제이 이전 답변을 참조하십시오.

    그런 다음 SET 명령으로 런타임에 값을 변경하고 (...) current_setting으로 그 값을 얻을 수는 postgresql.conf에 GUC을 선언합니다.

    나는 일반적인 사용이 권장되지 않습니다,하지만 포스터 트리거 및 기능에 대한 응용 프로그램 수준의 사용자 이름을 제공 할 수있는 방법을 원 링크 된 질문에서 언급 한 같은 좁은 경우에 유용 할 수 있습니다.

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

    9.나는 임시 테이블로 해결.

    나는 임시 테이블로 해결.

    CREATE TEMP TABLE temp_session_variables (
        "sessionSalt" TEXT
    );
    INSERT INTO temp_session_variables ("sessionSalt") VALUES (current_timestamp || RANDOM()::TEXT);
    

    이 방법은, 내가 세션에 대한 고유 한 "변수"나는 여러 쿼리를 통해 사용할 수를했다. 나는 동일한 사용자 이름으로 사용자를 가져 오는 경우 여전히 충돌을 가지고 있지 동안 독특한 "사용자 이름"을 생성 할 필요했습니다.

  10. ==============================

    10.나는이 문제를 발견하고는 매우 유용하지만, 또한 혼란에 응답합니다. 나는 문제가 많은이 작업에 변수를 인용지고 있었다, 그래서 여기에 내가 일을 가지고 방법입니다 :

    나는이 문제를 발견하고는 매우 유용하지만, 또한 혼란에 응답합니다. 나는 문제가 많은이 작업에 변수를 인용지고 있었다, 그래서 여기에 내가 일을 가지고 방법입니다 :

    \set deployment_user username    -- username
    \set deployment_pass '\'string_password\''
    ALTER USER :deployment_user WITH PASSWORD :deployment_pass;
    

    이 방법은 하나의 문에서 변수를 정의 할 수 있습니다. 당신이 그것을 사용하는 경우, 작은 따옴표는 변수에 포함됩니다.

    노트! 내가 인용 변수 후 댓글을 넣었을 때 나는 다른 답변에서 몇 가지 방법을 시도 할 때이 변수의 한 부분으로 빨려있어. 그건 정말 잠시 동안 나를 속이고 있었다. 이 방법 코멘트 예상대로 처리 한 것으로 나타났습니다.

  11. ==============================

    11.난 정말 그 기능을 그리워. 비슷한 달성하는 유일한 방법은 함수를 사용하는 것입니다.

    난 정말 그 기능을 그리워. 비슷한 달성하는 유일한 방법은 함수를 사용하는 것입니다.

    나는 두 가지 방법을 사용하고 있습니다 :

    펄 버전 :

       CREATE FUNCTION var(name text, val text) RETURNS void AS $$
            $_SHARED{$_[0]} = $_[1];
       $$ LANGUAGE plperl;
       CREATE FUNCTION var(name text) RETURNS text AS $$
            return $_SHARED{$_[0]};
       $$ LANGUAGE plperl;
    

    표 버전 :

    CREATE TABLE var (
      sess bigint NOT NULL,
      key varchar NOT NULL,
      val varchar,
      CONSTRAINT var_pkey PRIMARY KEY (sess, key)
    );
    CREATE FUNCTION var(key varchar, val anyelement) RETURNS void AS $$
      DELETE FROM var WHERE sess = pg_backend_pid() AND key = $1;
      INSERT INTO var (sess, key, val) VALUES (sessid(), $1, $2::varchar);
    $$ LANGUAGE 'sql';
    
    CREATE FUNCTION var(varname varchar) RETURNS varchar AS $$
      SELECT val FROM var WHERE sess = pg_backend_pid() AND key = $1;
    $$ LANGUAGE 'sql';
    

    노트:

  12. ==============================

    12.psql 프로그램의 변수는 빨아. 당신은 정수를 선언하려면, 다음, 다음 캐리지 리턴을 수행 정수를 입력 세미콜론에서 문을 종료해야합니다. 관찰 :

    psql 프로그램의 변수는 빨아. 당신은 정수를 선언하려면, 다음, 다음 캐리지 리턴을 수행 정수를 입력 세미콜론에서 문을 종료해야합니다. 관찰 :

    이 전 정수 변수 my_var을 선언하고 테이블 테스트에 삽입 할 가정 해 봅시다 :

    예 테이블 테스트 :

    thedatabase=# \d test;
                             Table "public.test"
     Column |  Type   |                     Modifiers                     
    --------+---------+---------------------------------------------------
     id     | integer | not null default nextval('test_id_seq'::regclass)
    Indexes:
        "test_pkey" PRIMARY KEY, btree (id)
    

    분명히, 아직이 테이블에 아무것도 :

    thedatabase=# select * from test;
     id 
    ----
    (0 rows)
    

    우리는 변수를 선언합니다. 공지 사항 세미콜론이 다음 줄에 얼마나!

    thedatabase=# \set my_var 999
    thedatabase=# ;
    

    이제 우리는 삽입 할 수 있습니다. 우리는이 이상한 사용해야합니다 ": '' '보고 구문 :

    thedatabase=# insert into test(id) values (:'my_var');
    INSERT 0 1
    

    그것은했다!

    thedatabase=# select * from test;
     id  
    -----
     999
    (1 row)
    

    설명:

    우리가 다음 줄에 세미콜론이없는 경우 그래서 ... 무슨 일이? 변수? 보라 :

    우리는 새로운 라인없이 my_var을 선언합니다.

    thedatabase=# \set my_var 999;
    

    하자의 선택 my_var.

    thedatabase=# select :'my_var';
     ?column? 
    ----------
     999;
    (1 row)
    

    즉, 무슨 일입니까? 그것은, 그것은 문자열 999 정수입니다 아니에요 ;!

    thedatabase=# select 999;
     ?column? 
    ----------
          999
    (1 row)
    
  13. ==============================

    13.나는 다른 스레드에서 이것에 대한 새로운 솔루션을 게시했습니다.

    나는 다른 스레드에서 이것에 대한 새로운 솔루션을 게시했습니다.

    그것은 매장 변수 테이블을 사용하고, 언제든지 업데이트 할 수 있습니다. 정적 불변의 getter 함수는 동적으로 테이블에 업데이트로 트리거 (다른 함수에 의해) 작성됩니다. 당신은 좋은 테이블 저장을받을 플러스 불변의 게터의 빠른 속도를 타오르는.

  14. from https://stackoverflow.com/questions/36959/how-do-you-use-script-variables-in-psql by cc-by-sa and MIT license