복붙노트

[SQL] PostgreSQL의에서 문자열 값 (같은 평가) 내부 쿼리를 실행할 수있는 방법이 있습니까?

SQL

PostgreSQL의에서 문자열 값 (같은 평가) 내부 쿼리를 실행할 수있는 방법이 있습니까?

나는 이런 식으로하고 싶지 :

SELECT (EVAL 'SELECT 1') + 1;

PostgreSQL의이 (EVAL)처럼 할 수있는 방법이 있습니까?

해결법

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

    1.당신이 "평가"하려고하는 문은 항상 동일한 데이터 형식을 반환하는 경우, 당신은 사용이 그르 언급 EXECUTE 것으로 평가 후면 () 함수를 작성할 수 있습니다.

    당신이 "평가"하려고하는 문은 항상 동일한 데이터 형식을 반환하는 경우, 당신은 사용이 그르 언급 EXECUTE 것으로 평가 후면 () 함수를 작성할 수 있습니다.

    create or replace function eval(expression text) returns integer
    as
    $body$
    declare
      result integer;
    begin
      execute expression into result;
      return result;
    end;
    $body$
    language plpgsql
    

    그럼 당신은 같은 뭔가를 할 수

    SELECT eval('select 41') + 1;
    

    동적 문은 당신이 평가하려는 각 표현 뭔가 다른를 반환하지만이 방법은 작동하지 않습니다.

    이 임의의 문장을 실행하여 큰 보안 위험을 여는 또한 명심. 그게 문제가 될 경우 사용자의 환경에 따라 달라집니다. 그는 대화 형 SQL 세션에서 사용하는 경우 그것은 문제가되지 않습니다.

  2. ==============================

    2.언어 PLpgSQL 구문이 있다고 가정하는 여러 가지 방법을 :

    언어 PLpgSQL 구문이 있다고 가정하는 여러 가지 방법을 :

     Y := f(X);
    

    실행] 절은, 전용 "동적 실행"(이하 성능)입니다

     EXECUTE 'f(X)' INTO Y;     
    

    사용 Y = F (X); 또는, 정적 선언을 실행하기위한 SELECT

     SELECT f(X) INTO Y;
    

    결과를 폐기 또는 무효 반환과 함께 일을 할 때 사용 문을 수행합니다 :

     PERFORM f(X);     
    
  3. ==============================

    3.이 필요한 경우처럼 :: INT 캐스팅 연산자를 사용하여 더 유연하기 때문에 나는 데이터 형식의 텍스트로 갈 것 :

    이 필요한 경우처럼 :: INT 캐스팅 연산자를 사용하여 더 유연하기 때문에 나는 데이터 형식의 텍스트로 갈 것 :

    create or replace function eval( sql  text ) returns text as $$
    declare
      as_txt  text;
    begin
      if  sql is null  then  return null ;  end if ;
      execute  sql  into  as_txt ;
      return  as_txt ;
    end;
    $$ language plpgsql
    -- select eval('select 1')::int*2         -- => 2
    -- select eval($$ select 'a'||1||'b' $$)  -- => a1b
    -- select eval( null )                    -- => null
    

    I의이 다른 평가를 첨가 (SQL, keys_arr, vals_arr) 함수 일부 사용자 키 값 대체를지지, 예를 들어 포스트 그레스 - 유틸에 PARAM1 대체 : 편리를위한

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

    4.당신을 맞는하지만 PostgreSQL의 EXECUTE 문을 가지고 있는지 확실하지 않다.

    당신을 맞는하지만 PostgreSQL의 EXECUTE 문을 가지고 있는지 확실하지 않다.

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

    5.좋은 생각. 당신은 직접적인 표현을 수행하기 위해 수정할 수 있습니다 :

    좋은 생각. 당신은 직접적인 표현을 수행하기 위해 수정할 수 있습니다 :

    create or replace function eval(expression text) returns integer
    as
    $body$
    declare
      result integer;
    begin
      execute 'SELECT ' || expression into result;
      return result;
    end;
    $body$
    language plpgsql;
    

    그냥이 입력 실행하려면 :

    SELECT eval('2*2');
    
  6. from https://stackoverflow.com/questions/7433201/are-there-any-way-to-execute-a-query-inside-the-string-value-like-eval-in-post by cc-by-sa and MIT license