2017-04-08 1 views
-1

나는 그것을 수행하는 내장 함수에 대해 알고있다. 그러나 나는 SQL을 배우고 이러한 함수없이 이것을 만드는 방법을 알고 싶습니다. 즉, 나는 다음 코드를 :쿼리 결과를 텍스트 변수에 저장하는 방법은 무엇입니까?

DECLARE @stmt VARCHAR; 
SELECT column_1 INTO @stmt FROM some_table; 

내가 단일 문자열 'value 1, value2, value 3, ..., value N'@stmt에 모든 값을 저장하려면이 코드를 변경할 수 있습니까? 당신이 column_1의 다른 값을 CONCAT하려면

+1

? 다른 컬럼들. 아니면'column 1'의 값이 다른가 – Utsav

+0

값은'column_1'에서 나온 값입니다. 나는 이제'FOR ... IN ... LOOP ... END LOOP; '를 사용하는 해결책을 발견했다. 어쩌면 다른 해결책이있을 수도 있습니다. –

+0

질문의 질을 향상 시키려면 지금까지 수행 한 연구, 시도한 것, 일어날 희망, 실제로 발생한 문제 (수신 한 오류 메시지 포함)에 대한 증거를 제시하십시오. 자세한 내용은 http://stackoverflow.com/help/how-to-ask를 참조하십시오. – toonice

답변

2

, 다음 몇 가지 검색 한 후이

SELECT string_agg(column_1,',') INTO @stmt FROM some_table; 
+0

집계 및 기타 기능이없는 SQL 연산자 만 사용하는 방법을 물었습니다. –

+0

오. 질문을 제대로 읽지 못했습니다. 다른 함수를 사용하지 않고 for의 접근 방식이 정확합니다. – Utsav

+0

답을 보내 주셔서 감사합니다. 저는 'FOR'구조로 만들어 보려고합니다. 나는 당신의 솔루션이 정확하기 때문에 어떠한 경우에도 투표를했습니다. 물론이 기능들을 사용할 것입니다. 그러나 그렇게하는 일을 해결하면 연습과 마찬가지로 언어를 더 깊게 할 수 있습니다. –

1

을 사용 그래서 그것을 해결 :

CREATE OR REPLACE FUNCTION get_table_names() RETURNS VARCHAR AS $$ 
DECLARE stmt VARCHAR; 
DECLARE temp_row RECORD; 
BEGIN 
    FOR temp_row IN (SELECT table_name FROM information_schema.tables) 
     LOOP 
      IF stmt IS NULL 
       THEN stmt := temp_row.table_name; 
       ELSE stmt := stmt || ',' || temp_row.table_name; 
      END IF; 
     END LOOP; 
    RETURN stmt; 
END; 
$$ LANGUAGE plpgsql; 

나는 그것이 최선이라고 생각하지 않습니다 솔루션 내 경우에도 불구하고 더 나은 찾을 수 없습니다. 많은


더 나은 솔루션 :` '값 1, 값 2, 값 3, ..., 값 N'`가에서 오는

CREATE OR REPLACE FUNCTION get_table_names() 
    RETURNS VARCHAR 
AS 
$$ 
    SELECT string_agg(table_name,',') 
    FROM information_schema.tables; 
$$ 
LANGUAGE sql; 
+0

이것은 불필요하게 복잡하고 비효율적입니다. information_schema.tables에서'select string_agg (table_name, ',')을 사용하는 것은 ** 많은 ** 더 나은 해결책입니다. –

관련 문제