Home » SQL » POSTGRES » postgresql concat 함수와 concat_ws 함수에 대해 알아봅시다.

postgresql concat 함수와 concat_ws 함수에 대해 알아봅시다.

postgresql에서 concat 함수와 concat_ws는 문자열들을 이어 붙일 때 사용할 수 있습니다.


먼저, concat은 여러 문자열을 한 번에 이어버릴 때 쓸 수 있습니다.

[그림 1] concat 으로 두 문자열을 잇는 쿼리 1

쿼리 1을 보겠습니다. concat(“a”, “b”)를 했는데요. 이 경우, 문자열 “a”와 “b”를 이어 붙이게 됩니다. 즉, 결과는 “a”에 “b”가 덧붙여진 “ab”가 나오게 됩니다.

[그림 2] 쿼리 1의 결과

“a”가 “b”를 이어 붙였으니, “ab”가 나오는 것은 당연한 이치입니다. 여러 문자열을 이을 수는 없을까요? 놀랍게도, 그럴 수 있습니다. “a”, “|”, “b”, “|”, “c”를 이어 보겠습니다. 총 문자열의 개수는 5개입니다.

[그림 3] 5개의 문자열을 이어버리는 쿼리 2

이 쿼리의 실행 결과는 어떻게 나올까요? “a”와 “|”를 이어 붙여보겠습니다. 그러면 “a|”가 나오게 됩니다. 이 결과에 다시 “b”를 이어 붙이면 “a|b”가 나옵니다. 이 결과에 “|”를 이어볼까요? 그러면 “a|b|”가 나오게 됩니다. 이 결과에 다시 “c”를 이어 붙이면 “a|b|c”가 나오게 됩니다. 최종적으로 결과는 아래와 같이 나옵니다.

[그림 4] 쿼리 2의 결과

“a|b|c”가 나왔네요. 이렇게 문자열의 개수와 상관 없이 이어 붙일 수 있는 postgresql concat 함수는 아래와 같이 동작해요.

concat(s1, s2)를 봅시다. 이 경우, 문자열 s1에다가 문자열 s2를 이어 붙이게 됩니다.

이제 concat(s(1), s(2), … , s(n)), 그러니까 string 인자 n개를 함수의 인자에 넣습니다. 그러면, 문자열 s(1) 뒤에 s(2), s(3), … , s(n) 순서대로 붙이게 됩니다.


그런데, “a|b|c” 같은 것은, 중간에 “|”라는 구분자가 들어가 있어요. concat으로 5개의 문자열을 잇는 방법도 있지만, 더 간결한 방법이 있어요. 바로 postgresql concat_ws 함수를 이용하는 것입니다.

[그림 5] 문자열 3개의 delimeter를 이용하는 쿼리 3

이 함수는 1번째 인자로 구분자를 받습니다. 그 다음 인자들은 토큰들이라고 생각하시면 편해요. 뒤에 나오는 토큰들을 각각 토큰 1, 2, 3이라고 하면 토큰 1, 구분자, 토큰 2, 구분자, 토큰 3 이런 식으로 이어 붙여지게 됩니다. 위 예제는 구분자가 “|”이고, 토큰 1이 “a”, 2가 “b”, 3이 “c”입니다. 고로 “a|b|c” 이렇게 이어 붙여지게 됩니다.

다시 말해, 모든 인자를 잇는데 1번째 인자만 구분자로 쓰이게 됩니다. 토큰들을 연결하는데, 구분자를 토큰들 사이에 붙인다고 이해하시면 편하겠습니다.

[그림 6] 쿼리 3의 결과

결과로는 “a|b|c”가 나왔음을 알 수 있습니다.

[그림 7] concat_ws 함수의 동작

위 그림에서, concat_ws(del, s(1), … , s(n)) 형식으로 왔을 때 어떻게 결과가 나오는지 간단하게 도식화 하였습니다. s(1)부터 s(n)까지가 토큰들이고, 각각의 토큰들 사이에 구분자 역할을 하는 del이 껴 있음을 볼 수 있어요.

Leave a Comment

16 − 10 =