2015-01-13 3 views
2
에서 분리 값 열에 직접 줄 바꿈 또는 캐리지 리턴을 추가

나는 다음과 같은 쿼리를 가지고 : 그러나 출력 다음는 포스트 그레스

| id | Person1    | Person2 
---------------------------------------------- 
| 1 | Blue, Male, Adult | Brown, Female, Adult 
---------------------------------------------- 
| 2 | Blue, Male, Adult | Brown, Female, Adult 

, 나는 오히려 표시했을 것이다

SELECT id, 
concat_ws(', ', 
      case when isBlue then 'Blue' end, 
      case when isMale then 'Male' end, 
      case when isAdult then 'Adult' end) as Person1, 
concat_ws(', ', 
      case when isBrown then 'Brown' end, 
      case when isFemale then 'Female' end, 
      case when isAdult then 'Adult' end) as Person2   
from misc_table 
where id <> NULL 
order by id 

예 :

| id | Person1    | Person2 
---------------------------------------------- 
| 1 | Blue,    | Brown, 
| | Male,    | Female, 
| | Adult    | Adult 
---------------------------------------------- 
| 2 | Blue,    | Brown, 
| | Male,    | Female, 
| | Adult    | Adult 

이 작업을 수행하는 간단한 방법을 찾을 수 없습니다. 모든 제안을 부탁드립니다! 당신이 E'' 문자열을 사용하는 경우 일부 C 스타일을 사용할 수 있습니다

답변

6

fine manual에서, 문자열 리터럴에서 탈출 :

4.1.2.2. C 스타일 이스케이프 문자열 상수

PostgreSQL은 SQL 표준의 확장 인 "이스케이프"문자열 상수도 허용합니다. 이스케이프 문자열 상수는 열기 작은 따옴표 바로 앞에 E (대문자 또는 소문자)을 쓰면 지정됩니다 (예 : E'foo'). (회선간에 이스케이프 문자열 상수를 계속 사용하는 경우 첫 번째 인용 인용 전에 만 E를 써야합니다.) 이스케이프 문자열 내에서 백 슬래시 문자 (\)는 C와 비슷한 백 슬래시 이스케이프 시퀀스를 시작하며 백 슬래시와 문자는 표 4-1에 표시된 것처럼 특수 바이트 값을 나타냅니다.

그래서 당신은 말할 수 :

SELECT id, 
concat_ws(E',\n', ... 
-- -------^^^^^^ 

당신에게 비록 psql 출력의 일부 + 표시 줄 것이다 :

| id | Person1    | Person2 
---------------------------------------------- 
| 1 | Blue,    +| Brown,   + 
| | Male,    +| Female,   + 
| | Adult    | Adult 
... 

을하지만 그건 단지 psql 다중이 있음을 말하고 행의 열 값입니다.

BTW, id <> null 당신이 생각하는대로하지 않으면, 확실하게 합리적인 결과를 얻으려면 id is not null라고 말하고 싶을 것입니다.

+0

을 나는대로 C 스타일의 접근 방식은 빠르게/더 effecient 사용하여 CHR (10) 메소드 대 직접 쿼리입니다 같은데요 그것은 낮은 수준입니까? – SiriusBits

+0

나는 그 (것)들 사이에 측정 할 수있는 차이를 찾기가 어려울 것이라고 생각합니다. 행성에있는 거의 모든 프로그래머는'\ n'이 'E'를 의미하는 것을 알 것이며, \ n "은 아마 더 읽기 쉽습니다. –

2

당신은 chr를 호출하여 개행 문자를 강제 할 수

SELECT id, 
concat_ws(',' || CHR(10), -- HERE 
      case when isBlue then 'Blue' end, 
      case when isMale then 'Male' end, 
      case when isAdult then 'Adult' end) as Person1, 
concat_ws(',' || CHR(10), -- And HERE 
      case when isBrown then 'Brown' end, 
      case when isFemale then 'Female' end, 
      case when isAdult then 'Adult' end) as Person2   
from misc_table 
where id IS NOT NULL -- BTW, note that nulls should be evaluated with the IS operator 
order by id 
+0

비평은 아니지만, 이것을 사용하여 누구나'CHR (10), - 개행 문자 '를 나타내는 주석을 추가 할 것을 제안합니다. 장래의 개발자는이 마법 값을 찾아 볼 필요가 없습니다 (문자 코드의 역 검색을 수행하십시오 재미 있지 않다) – AaronLS

+0

@AaronLS +1! 솔직히, 나는'select * from my_table where some_column = 'some_value''가 아닌 모든 쿼리를 문서화 하겠지만, 이와 같은 상황에서는 더욱 그렇다. – Mureinik

+0

@Mureinik 감사합니다! – SiriusBits