여러 열과 하나의 열을 연결할 때 공백이 null입니다(Oracle
각 값 사이에 공백을 두고 여러 개의 열을 하나로 연결해야 합니다.문제는 하나의 값이 null일 경우 두 값 사이에 이중 공백이 발생한다는 것입니다.
예
SELECT (FIRST_NAME || ' ' || MIDDLE_NAME || ' ' || LAST_NAME
FROM TABLE_A;
중간 이름이 NULL이면 성과 성 사이에 두 개의 공백이 생깁니다.이 문제를 해결하고 널 값이 있을 때 하나의 공간만 가질 수 있는 방법이 있습니까?
SELECT TRIM(TRIM(FIRST_NAME || ' ' || MIDDLE_NAME) || ' ' || LAST_NAME)
FROM TABLE_A;
Oracle 설명서에서 다음을 참조하십시오.
CONCAT_WS(분리막, str1, str2,...)
CONCAT_WS()는 Concatenate With Separator의 약자이며 CONCAT()의 특별한 형태입니다.첫 번째 인수는 나머지 인수의 구분자입니다.구분 기호는 연결할 문자열 사이에 추가됩니다.구분 기호는 나머지 인수와 마찬가지로 문자열일 수 있습니다.구분자가 NULL이면 결과는 NULL입니다.
그리고 아주 중요한 언급은.
CONCAT_WS()는 빈 문자열을 건너뛰지 않습니다.그러나 구분자 인수 뒤에 NULL 값을 건너뛰지는 않습니다.
그러니 당신의 경우는 다음과 같습니다.
CONCAT_WS(',', FIRST_NAME, MIDDLE_NAME, LAST_NAME);
with indata as
(
select 'John' as first_name, 'W' as middle_name, 'Smith ' as last_name from dual
union
select null as first_name, null as middle_name, 'Adams' as last_name from dual
union
select 'Tom' as first_name, null as middle_name, 'Jefferson' as last_name from dual
)
select
regexp_replace(trim(indata.first_name || ' ' || indata.middle_name || ' ' || indata.last_name), '\s{2,}', ' ')
from indata;
일반적으로 Oracle에서 여러 필드를 연결하고 공백을 제거하는 방법은 다음과 같습니다.
TRIM(REGEXP_REPLACE(HOUSE_NO || ' ' || PREFIX || ' ' || STREET_NAME || ' ' || STREET_TYPE || ' ' || SUFFIX, ' +', ' '))
- 필요한 모든 필드를 각 필드 사이에 공백으로 연결합니다.문자열과 NULL 값이 비어 있으면 공백이 두 개 이상 발생합니다.
- 정규식을 사용하여 여러 공백 [' +']을(를) 단일 공백 [' ']으로 변경합니다;
- 마지막으로 결과 문자열의 시작 및/또는 끝 부분의 공백을 모두 잘라냅니다.
공백 문자를 추가하는 데 사용할 수 있습니다.
SELECT RPAD(first_name, LENGTH(first_name)+1, ' ')||RPAD(middle_name, LENGTH(middle_name)+1, ' ')||last_name
FROM TABLE_A;
매개 변수 중 하나라도 다음 작업을 수행할 때RPAD
NULL이고 결과는 NULL이 되며 문자열에 NULL을 추가하는 Oracle에서는 원래 문자열을 반환합니다.
다른 옵션은 디코딩을 사용하는 것입니다.
SELECT decode(FIRST_NAME,'','',FIRST_NAME ||' ') ||
decode(MIDDLE_NAME,'','',MIDDLE_NAME ||' ') || LAST_NAME
FROM TABLE_A;
또 다른 옵션:
SELECT first_name
|| DECODE(middle_name
, NULL, NULL
, ' ' || middle_name)
|| DECODE(last_name
, NULL, NULL
, ' ' || last_name) full_name
FROM table_a
;
또는 단순히 REFRANCE 기능을 사용할 수도 있습니다.
with indata as
(select 'John' as first_name, 'W' as middle_name, 'Smith ' as last_name from dual
union
select null as first_name, null as middle_name, 'Adams' as last_name from dual
union
select 'Tom' as first_name, null as middle_name, 'Jefferson' as last_name from dual)
SELECT REPLACE(TRIM(indata.first_name || ' ' || indata.middle_name || ' ' || indata.last_name), ' ', ' ')
FROM indata
(그리고 예제 데이터에 대해 @tbone에게 감사드립니다 :-)
저는 이 일을 본보기로 삼았습니다.도움이 되길 바랍니다.SQL 서버로 이동하여 새 쿼리를 선택하고 다음 쿼리를 따르는 CP를 선택합니다.
DECLARE @NULL_SAMLES TABLE
(
NS_ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL
,COL_01 VARCHAR(10) NULL
,COL_02 VARCHAR(10) NULL
,COL_03 VARCHAR(10) NULL
,COL_04 VARCHAR(10) NULL
)
INSERT INTO @NULL_SAMLES(COL_01,COL_02,COL_03,COL_04)
VALUES
('A','B','C','D')
,(' ' ,'B','C','D')
,(' ',NULL,'C','D')
,('A','B',NULL,'D')
,('A','B','C',NULL)
,(NULL,'B',NULL,'D')
,(NULL,'B','C',NULL)
,('A',NULL,'C',NULL)
,('A',NULL,NULL,'D')
,('A',NULL,NULL,NULL)
,(NULL,'B',NULL,NULL)
,(NULL,NULL,'C',NULL)
,(NULL,NULL,NULL,'D')
SELECT
NS.COL_01
,NS.COL_02
,NS.COL_03
,NS.COL_04,
Stuff(
Coalesce(', ' + nullif(NS.COL_01, ''), '')
+ Coalesce(', ' + nullif(NS.COL_02, ''), '')
+ Coalesce(', ' + nullif(NS.COL_03, ''), '')
+Coalesce(', ' + nullif(NS.COL_04, ''), '')
, 1, 1, '') AS CONC_COLS
FROM @NULL_SAMLES NS
연결될 수 있는 CASE 문장의 단순한 힘을 과소평가하지 마십시오.있는 그대로 실행할 수 있는 자체적인 예제는 다음과 같습니다.
SELECT
CASE WHEN x.FIRST_NAME IS NULL THEN x.FIRST_NAME ELSE x.FIRST_NAME || ' ' END ||
CASE WHEN x.MIDDLE_NAME IS NULL THEN x.MIDDLE_NAME ELSE x.MIDDLE_NAME || ' ' END ||
x.LAST_NAME
FROM (SELECT 'John' AS FIRST_NAME, NULL AS MIDDLE_NAME, 'Doe' AS LAST_NAME FROM DUAL) x;
언급URL : https://stackoverflow.com/questions/11956844/spaces-when-concatenating-multiple-columns-and-one-column-is-null-oracle
'programing' 카테고리의 다른 글
각도 디버그 방법크롬 브라우저의 JS (0) | 2023.10.04 |
---|---|
파티션마다 다른 스토리지 엔진 사용 (0) | 2023.10.04 |
WooCommerce 이메일 알림에서 로컬 픽업 시 발송 주소 숨기기 (0) | 2023.09.24 |
Angular의 경로를 기반으로 메타 설명을 동적으로 추가합니다. (0) | 2023.09.24 |
호출 함수에서 jquery ajax 콜백을 기다립니다. (0) | 2023.09.24 |