programing

여러 열과 하나의 열을 연결할 때 공백이 null입니다(Oracle

lastcode 2023. 10. 4. 21:57
반응형

여러 열과 하나의 열을 연결할 때 공백이 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, ' +', ' '))

  1. 필요한 모든 필드를 각 필드 사이에 공백으로 연결합니다.문자열과 NULL 값이 비어 있으면 공백이 두 개 이상 발생합니다.
  2. 정규식을 사용하여 여러 공백 [' +']을(를) 단일 공백 [' ']으로 변경합니다;
  3. 마지막으로 결과 문자열의 시작 및/또는 끝 부분의 공백을 모두 잘라냅니다.

공백 문자를 추가하는 데 사용할 수 있습니다.

SELECT RPAD(first_name, LENGTH(first_name)+1, ' ')||RPAD(middle_name, LENGTH(middle_name)+1, ' ')||last_name
FROM TABLE_A;

매개 변수 중 하나라도 다음 작업을 수행할 때RPADNULL이고 결과는 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

반응형