[SQL] SQL의 모든 열 값 CONCAT
SQLSQL의 모든 열 값 CONCAT
어떻게 하나 개의 값으로 SQL 쿼리에서 반환 된 다른 행의 모든 열 값을 CONCAT하는? 이 예입니다 :
쿼리 반환 :
FOO ------ RES1 RES2 RES3
지금은 다음과 같은 결과를 갖고 싶어 :
FOOCONCAT ----- RES1RES2RES3
SQL에서이 작업을 수행하기 위해 어떤 방법이 있습니까?
해결법
-
==============================
1.SQL 서버의 경우 :
SQL 서버의 경우 :
SELECT col1 AS [text()] FROM foo FOR XML PATH ('')
MySQL은 :
SELECT GROUP_CONCAT(col1 SEPARATOR '') FROM foo
PostgreSQL의에서 :
SELECT array_to_string ( ARRAY ( SELECT col1 FROM foo ), '' )
오라클의 경우 :
SELECT * FROM ( SELECT col1, ROW_NUMBER() OVER(ORDER BY 1) AS rn FROM foo MODEL DIMENSION BY (rn) MEASURES (col1, col1 AS group_concat, 0 AS mark) RULES UPDATE ( group_concat[rn > 1] = group_concat[CV() - 1] || col1[CV()], mark[ANY] = PRESENTV(mark[CV() + 1], 0, 1) ) ) WHERE mark = 1
-
==============================
2.Quassnoi의 오라클 솔루션은 매우 인상적이다,하지만 난 간단 SYS_CONNECT_BY_PATH를 사용하는 것 ()보다는 모델의 마법을 발견했다.
Quassnoi의 오라클 솔루션은 매우 인상적이다,하지만 난 간단 SYS_CONNECT_BY_PATH를 사용하는 것 ()보다는 모델의 마법을 발견했다.
SELECT REPLACE(MAX(SYS_CONNECT_BY_PATH(foo, '/')), '/', '') conc FROM ( SELECT T_FOO.*, ROW_NUMBER() OVER (ORDER BY FOO) R FROM T_FOO ) START WITH r=1 CONNECT BY PRIOR r = r-1;
-
==============================
3.MySQL의 방법 :
MySQL의 방법 :
select group_concat(somecolumn separator '') from sometable
-
==============================
4.그것은 여러 값을 하나 개의 컬럼 있다고 가정하면,이 방법은 (내가 다른 시스템에 대해 말할 수 없다) MS SQL 서버에 적용됩니다.
그것은 여러 값을 하나 개의 컬럼 있다고 가정하면,이 방법은 (내가 다른 시스템에 대해 말할 수 없다) MS SQL 서버에 적용됩니다.
declare @result varchar(max) set @result = '' select @result = @result + RES from (query goes here)
-
==============================
5.여기에 당신이 찾고있는 대답은, 나는이 솔루션은 CONNECT BY 작업에 누워 느낌을했다, 난 그냥 전에 SYS_CONNECT_BY_PATH 의사 열을 사용하지 않았다 (이 표시 트리에서 노드의 전체 경로는 "/"로 노드 이름을 분리). 가정 당신의 "foo는"값이 이전 예컨대 열 "의 mykey"로 그룹화 테이블의 여러 행입니다 세트 :
여기에 당신이 찾고있는 대답은, 나는이 솔루션은 CONNECT BY 작업에 누워 느낌을했다, 난 그냥 전에 SYS_CONNECT_BY_PATH 의사 열을 사용하지 않았다 (이 표시 트리에서 노드의 전체 경로는 "/"로 노드 이름을 분리). 가정 당신의 "foo는"값이 이전 예컨대 열 "의 mykey"로 그룹화 테이블의 여러 행입니다 세트 :
myKey foo -------- ---------- group 1 apple group 1 orange group 1 pear group 2 ape group 2 bear group 2 kitten
당신은 나무 스키마 것처럼 데이터를 처리하고, 각 그룹의 값이 지점 아래로가는 노드를 대표하는 척 할 수 있습니다. 이 경우, 당신은이 작업을 수행 할 것입니다 :
SELECT myKey , SUBSTR(MAX(REPLACE(SYS_CONNECT_BY_PATH(foo, '/') ,'/' ,' ' ) ) ,2 ) FooConcat FROM ( SELECT MyKey , Foo , row_number() OVER (Partition by myKey order by myKey) NodeDepth FROM MyTable ) START WITH NodeDepth = 1 CONNECT BY PRIOR myKey = myKey AND PRIOR NodeDepth = NodeDepth -1 GROUP BY myKey ;
물론, 연결된 값의 순서는 무작위 것; 테이블이 다른 열 당신이 주문 상승 된 필드와 연속으로 사용할 수 있다는 것을 ( "바")가 있다면, 당신은 하위 쿼리와 분배 (만 나무에 가상의 깊이를 넣어 존재하는) 직접 테이블을 사용할 수 있습니다, 바 NodeDepth 교체.
-
==============================
6.편집 : 버전 8.4.0 CUBRID는 MySQL과 90 %의 호환성을 제공하기 때문에. 따라서, MySQL은 유사한 구문 GROUP_CONCAT을 지원
편집 : 버전 8.4.0 CUBRID는 MySQL과 90 %의 호환성을 제공하기 때문에. 따라서, MySQL은 유사한 구문 GROUP_CONCAT을 지원
CREATE TABLE t(i int); INSERT INTO t VALUES (4),(2),(3),(6),(1),(5); SELECT GROUP_CONCAT(i*2+1 ORDER BY 1 SEPARATOR '') FROM t; group_concat(i*2+1 order by 1 separator '') ====================== '35791113'
아주 강력하고, 그렇지? 그리고 아래 CUBRID에서 기본적으로 지원되는 대체 솔루션입니다.
SELECT MAX(SYS_CONNECT_BY_PATH(s_name, '')) AS conc_s_name FROM ( SELECT ROWNUM AS r, s_name FROM code ) AS res START WITH r = 1 CONNECT BY PRIOR r = r - 1;
그것은 @devio에 의해 제공 CUBRID에서 다른 행의 열 값을 연결의 방법은 오라클의 방법과 거의 동일 너무 재미있다. CUBRID에서는 조금 더 쉽게 생각 보인다.
-
==============================
7.
select cast(res1 as varchar)+cast(res2 as varchar)+cast(res3 as varchar) as fooconcat from foo
당신이 캐스트가 필요하지 않습니다 열이 이미 문자열이 있다면, 당신은 할 수 있습니다 :
select res1 + res2 + res3 as fooconcat from foo
여러 행, 사용 PIVOT의 데이터를하십시오.
-
==============================
8.문자열을 연결하면 (당신이 간다 그래서 여기에 질문의 버전을 언급하지 않은) 사용중인 데이터베이스에 따라 달라집니다 ...
문자열을 연결하면 (당신이 간다 그래서 여기에 질문의 버전을 언급하지 않은) 사용중인 데이터베이스에 따라 달라집니다 ...
Oracle 및 DB2에서 당신은 CONCAT 기능 ... CONCAT을 사용할 수 있습니다 (문자열, 문자열)
SQL 서버는 당신이 '+'연산자를 사용할 수 있습니다 ... 문자열 1 + 문자열 2 + string3
MySQL의에서이 CONCAT입니다 (문자열, 문자열 ... n_string)
마지막으로 PostgreSQL의에서이 TEXTCAT (문자열, 문자열)입니다 ...
... 나는 그것을 확인 ... 난 내 책상 오라일리에서 SQL 포켓 가이드에 앉아있는이 작은 멋진 책이 밖으로있어!
:)
-
==============================
9.그것은 당신이 찾고있는,하지만이 같은 구조와 과거에 행운을 했어 무엇을하지 않을 수 있습니다 :
그것은 당신이 찾고있는,하지만이 같은 구조와 과거에 행운을 했어 무엇을하지 않을 수 있습니다 :
SELECT MAX(DECODE(fookey, 1, foo, NULL)) || MAX(DECODE(fookey, 2, foo, NULL)) || MAX(DECODE(fookey, 3, foo, NULL)) || MAX(DECODE(fookey, 4, foo, NULL)) , groupingvalue FROM mytable GROUP BY groupingvalue;
그것의 플랫폼 독립적 인, 그리고 당신은 임의의가 있지만 foo는 값의 수를 제한 할 때 잘 작동하고는 다른 키 값을 기반으로하고 있습니다. 당신이 청구서의 테이블을 가지고 있고, 당신이 연결된 단일 행에 송장의 모든 라인의 시간을보고 싶어, 당신은 5 개 라인 항목의 상한이있는 경우 예를 들어, 그 결과는 다음과 같습니다
SELECT MAX(DECODE(lineno, 1, foo, NULL)) || ', ' || MAX(DECODE(lineno, 2, foo, NULL)) || ', ' || MAX(DECODE(lineno, 3, foo, NULL)) || ', ' || MAX(DECODE(lineno, 4, foo, NULL)) || ', ' || MAX(DECODE(lineno, 5, foo, NULL)) , invoiceid FROM lineitem GROUP BY invoiceid;
-
==============================
10.SQL 서버 2008 R2 :
SQL 서버 2008 R2 :
declare @ColumnNameList VARCHAR(MAX) SELECT @ColumnNameList = COALESCE(@ColumnNameList +',' ,'') + ColumnName FROM <<table name>> select @ColumnNameList
-
==============================
11.나는 T-SQL에서 하나의 VARCHAR 문자열로 쿼리에 의해 반환 된 열에서 모든 기록을 연결하는 방법에 대한 해답을 찾았나요?
나는 T-SQL에서 하나의 VARCHAR 문자열로 쿼리에 의해 반환 된 열에서 모든 기록을 연결하는 방법에 대한 해답을 찾았나요?
declare @s varchar(8000) select @s = coalesce(@s + col, col) from tbl
이 해결한다
-
==============================
12.선택 ([COL1] + ','+ [COL2] + ','+ [COL3] + ','+ [col4]) MyCol]로서 [표]에서
선택 ([COL1] + ','+ [COL2] + ','+ [COL3] + ','+ [col4]) MyCol]로서 [표]에서
from https://stackoverflow.com/questions/970481/concat-all-column-values-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 데이터베이스의 트랜잭션 로그가 가득 (0) | 2020.05.20 |
---|---|
[SQL] SQLite는의 자동 증가가 있습니까? (0) | 2020.05.19 |
[SQL] SQL : 기본값 대 NULL 값을 사용하여 (0) | 2020.05.19 |
[SQL] 저장 프로 시저의 열 이름과 유형의 검색? [복제] (0) | 2020.05.19 |
[SQL] SQLCMD를 사용하여 PostDeployment.sql 스크립트에 조건부 논리 (0) | 2020.05.19 |