복붙노트

[SQL] SQL Server에 대한 CONCAT_WS ()

SQL

SQL Server에 대한 CONCAT_WS ()

어떻게 SQL 서버에서 MySQL을의 CONCAT_WS () 함수를 에뮬레이트 할 수 있습니까?

이 NULL이 아닌 항목 간 세퍼레이터 추가하는 것을 제외하고이 함수는 SQL 서버 2012 CONCAT () 함수와 유사하다 :

SELECT id, CONCAT_WS('; ', a, b, c, d) AS bar
FROM foo
ORDER BY id;
| ID | BAR        |
|----|------------|
|  1 | a; b; c; d |
|  2 | b; d       |
|  3 | a; d       |
|  4 |            |

(MySQL의 바이올린)

해결법

  1. ==============================

    1.우리는 트릭의 몇 가지를 사용할 수 있습니다 :

    우리는 트릭의 몇 가지를 사용할 수 있습니다 :

    그는 동작하는 예제입니다 :

    CREATE TABLE foo (
      id INT IDENTITY(1, 1) NOT NULL,
      a VARCHAR(50),
      b VARCHAR(50),
      c VARCHAR(50),
      d VARCHAR(50),
      PRIMARY KEY (id)
    );
    
    INSERT INTO foo (a, b, c, d) VALUES ('a', 'b', 'c', 'd');
    INSERT INTO foo (a, b, c, d) VALUES (NULL, 'b', NULL, 'd');
    INSERT INTO foo (a, b, c, d) VALUES ('a', NULL, NULL, 'd');
    INSERT INTO foo (a, b, c, d) VALUES (NULL, NULL, NULL, NULL);
    
    SELECT id,
    STUFF(
        COALESCE('; ' + a, '') +
        COALESCE('; ' + b, '') +
        COALESCE('; ' + c, '') +
        COALESCE('; ' + d, ''),
    1, 2, '') AS bar
    FROM foo
    ORDER BY id
    
    | ID | BAR        |
    |----|------------|
    |  1 | a; b; c; d |
    |  2 | b; d       |
    |  3 | a; d       |
    |  4 | (null)     |
    

    STUFF의 목적은 (..., 1, 2 '') (2는 우리의 경우, 세퍼레이터의 길이이다)의 초기 분리를 제거한다.

    이는 SQL 서버 2005 (및 이전 버전)에서 작동합니다.

    참고 : 원래 CONCAT_WS ()와는 달리, 모든 항목이 NULL 때 우리의 버전을 반환 NULL. 솔직히 그것이 더 나은 선택이라고 생각하지만, 어쨌든 쉽게 변경할 수 있어야한다.

  2. ==============================

    2.또 다른 방법은 다음과 같이 XML 하위 쿼리 for 문을 사용하는 것입니다 :

    또 다른 방법은 다음과 같이 XML 하위 쿼리 for 문을 사용하는 것입니다 :

    SELECT
      id,
      bar = STUFF(
        (
          SELECT '; ' + v
          FROM (VALUES (a), (b), (c), (d)) AS v (v)
          FOR XML PATH (''), TYPE
        ).value('.[1]', 'varchar(max)'),
        1, 2, ''
      )
    FROM foo
    ORDER BY id;
    

    한편,이 모습은 확실히 더 COALESCE 전화의 일련의보다 복잡합니다. 다른 한편으로,이 구분 기호는 한 번만 지정되어 있는지의 프로토 타입에 가깝다.

    사용 된 구문은 적어도 SQL Server를 2008+ 필요하지만 값 생성자가 변경되는 경우

    SELECT a UNION ALL
    SELECT b UNION ALL
    SELECT c UNION ALL
    SELECT d
    

    쿼리는 SQL Server 2005에서 실행됩니다.

  3. ==============================

    3.당신이 내장 사용할 수있는 2017 CONCAT_WS SQL 서버에서 시작 :

    당신이 내장 사용할 수있는 2017 CONCAT_WS SQL 서버에서 시작 :

    당신은 당신의 초기 쿼리를 사용할 수 있도록 :

    SELECT id, CONCAT_WS('; ', a, b, c, d) AS bar
    FROM foo
    ORDER BY id;
    

    DB <> 바이올린 데모

  4. ==============================

    4.SQL 서버 2012는 하나의 CONCAT와 COALESCE의 과다를 대체하여 허용 대답을 단순화 할 수 있습니다 :

    SQL 서버 2012는 하나의 CONCAT와 COALESCE의 과다를 대체하여 허용 대답을 단순화 할 수 있습니다 :

    WITH tests(a, b, c, d) AS (
        SELECT NULL, NULL, NULL, NULL UNION
        SELECT NULL, NULL, NULL,  'd' UNION
        SELECT NULL, NULL,  'c', NULL UNION
        SELECT NULL, NULL,  'c',  'd' UNION
        SELECT NULL,  'b', NULL, NULL UNION
        SELECT NULL,  'b', NULL,  'd' UNION
        SELECT NULL,  'b',  'c', NULL UNION
        SELECT NULL,  'b',  'c',  'd' UNION
        SELECT  'a', NULL, NULL, NULL UNION
        SELECT  'a', NULL, NULL,  'd' UNION
        SELECT  'a', NULL,  'c', NULL UNION
        SELECT  'a', NULL,  'c',  'd' UNION
        SELECT  'a',  'b', NULL, NULL UNION
        SELECT  'a',  'b', NULL,  'd' UNION
        SELECT  'a',  'b',  'c', NULL UNION
        SELECT  'a',  'b',  'c',  'd'
    )
    SELECT a, b, c, d,
    STUFF(CONCAT(
        '; ' + a,
        '; ' + b,
        '; ' + c,
        '; ' + d
    ), 1, 2, '') AS cat
    FROM tests
    
    a    | b    | c    | d    | cat
    -----+------+------+------+-----------
    NULL | NULL | NULL | NULL | NULL
    NULL | NULL | NULL | d    | d
    NULL | NULL | c    | NULL | c
    NULL | NULL | c    | d    | c; d
    NULL | b    | NULL | NULL | b
    NULL | b    | NULL | d    | b; d
    NULL | b    | c    | NULL | b; c
    NULL | b    | c    | d    | b; c; d
    a    | NULL | NULL | NULL | a
    a    | NULL | NULL | d    | a; d
    a    | NULL | c    | NULL | a; c
    a    | NULL | c    | d    | a; c; d
    a    | b    | NULL | NULL | a; b
    a    | b    | NULL | d    | a; b; d
    a    | b    | c    | NULL | a; b; c
    a    | b    | c    | d    | a; b; c; d
    
  5. ==============================

    5.나는 XML 경로와 함께 할. 대신 값의 조합 (UNION ALL)를 사용할 수 있습니다; 이것은 여전히 ​​SQL-Server 2005에서 작동하는 부가 가치를 (우리는 여전히 우리의 회사에서이를 지원해야)이 있고, 당신은 NULL 값을 제거 할 수 있습니다.

    나는 XML 경로와 함께 할. 대신 값의 조합 (UNION ALL)를 사용할 수 있습니다; 이것은 여전히 ​​SQL-Server 2005에서 작동하는 부가 가치를 (우리는 여전히 우리의 회사에서이를 지원해야)이 있고, 당신은 NULL 값을 제거 할 수 있습니다.

    DECLARE @in_SearchTerm1 nvarchar(100) 
    DECLARE @in_SearchTerm2 nvarchar(100) 
    DECLARE @in_SearchTerm3 nvarchar(100) 
    DECLARE @in_SearchTerm4 nvarchar(100) 
    
    SET @in_SearchTerm1 = N'a'
    SET @in_SearchTerm2 = N''
    SET @in_SearchTerm3 = N'c'
    SET @in_SearchTerm4 = N''
    
    SELECT 
        COALESCE
        (
            STUFF
            (
                (
                    SELECT ' / ' + RPT_SearchTerm AS [text()]
                    FROM 
                    (
                                      SELECT NULLIF(@in_SearchTerm1, N'') AS RPT_SearchTerm, 1 AS RPT_Sort 
                            UNION ALL SELECT NULLIF(@in_SearchTerm2, N'') AS RPT_SearchTerm, 2 AS RPT_Sort  
                            UNION ALL SELECT NULLIF(@in_SearchTerm3, N'') AS RPT_SearchTerm, 3 AS RPT_Sort 
                            UNION ALL SELECT NULLIF(@in_SearchTerm4, N'') AS RPT_SearchTerm, 4 AS RPT_Sort 
                    ) AS tempT 
                    WHERE RPT_SearchTerm IS NOT NULL 
                    ORDER BY RPT_Sort 
                    FOR XML PATH(N''), TYPE 
                ).value('.', 'nvarchar(MAX)') 
                ,1
                ,3
                ,N''
            )
            ,N''
        ) AS RPT_SearchTerms 
    

    이미 VARCHAR를 사용하여 정지 - NVARCHAR의 사용을합니다. 당신은 또한 순서를 유지하기 위해, 그것을 주문해야합니다.

    그래서 할 일이 무엇 :

    골: 보고서에서 4 개 별도의 필터에 inputed 4 개 검색어를 가져 가라. '/'로 연결된 보고서에서이 4 개 개의 검색어를 표시합니다. 없을해야 '/ /'검색어가 비어있는 경우. 그것은 순서대로 표시한다, 즉, 용어 1 / 용어 2 / term3 / term4이며, 예컨대하지 term4 / 용어 2 / term3 / 용어 1.

    어떻게: 당신 그래서 노동 조합에 4 개 검색어를 가지고, 질서를 유지하기 위해 정렬 값을 추가합니다.

    당신은 노동 조합에서 검색 용어와 구분을 선택 (separatur + 널 = 널)

    SELECT ' / ' + RPT_SearchTerm 
    FROM (UNION OF SEARCH TEMRS) AS tempT
    

    RPT_Sort하여 주문

    이제 (AS를 모든 값이 빈 태그 이름 (PATH (N '')와 XML 요소는 (XML에 대한) 하나 개의 XML 파일로 유혹에서 모든 값 (separater의 + 텍스트)를 선택하고 값을 XML 텍스트를 선택 [텍스트 ()]) (일명 element.innerXML).

    XML 요소 (TYPE)으로 그 결과를받을 수 있도록 XML 요소 (.value ( '.', 'NVARCHAR (MAX)')) (XML-디코드 일명)의 innerText와 문자열을 검색 할 수 있습니다.

    마지막으로, 최고의 '/'(다도 (VAR, 1,3, N '을')) 제거

    이것이 바로 원칙과 동일

    CONCAT_WS(' / ', @in_SearchTerm1, @in_SearchTerm2, @in_SearchTerm3, @in_SearchTerm4)
    

    이제, NULLIF 추가

    CONCAT_WS(' / ', NULLIF(@in_SearchTerm1, '') , NULLIF(@in_SearchTerm2, ''), NULLIF(@in_SearchTerm3, ''), NULLIF(@in_SearchTerm4, ''))
    

    당신은 거기.

    이것은 당신이 여전히 SQL-Server의 CONCAT_WS을 할 수있어 어떻게 ...

  6. ==============================

    6.나는 이것이 이전 게시물 알고하지만 난 동일한 문제가 온다.

    나는 이것이 이전 게시물 알고하지만 난 동일한 문제가 온다.

    나는 개별 필드에 저장된 주소 라인을 가지고 그리고 난 주소를 생성하는 모든 줄에 가입하고 싶었다.

    나는 그 CONCAT () 함수는 빈 문자열과 NULL 및을 대체 처리 할 수 ​​발견했다. 또한 아무것도 플러스 NULL은 NULL 경우입니다.

    그래서 일정한 CONCAT () 함수를 사용하는 광고가 NULL 후 결합이면 출력한다 널 각 어드레스 라인의 단부에 공간을 추가

    SELECT 
        CONCAT(Address01 + ' ', Address02 + ' ', Address03 + ' ', Address04) AS Address 
    FROM myTable
    
  7. from https://stackoverflow.com/questions/19432370/concat-ws-for-sql-server by cc-by-sa and MIT license