2016-10-27 2 views
1

두 문자열이 있는데, SQL에서 두 문자열의 내용간에 차이를 가져오고 싶습니까 ?? 예SQL에서 두 문자열 사이의 차이점을 찾는 방법

,

Declare @String1 as varchar(100)='a,b,c,d,e'; 

Declare @String2 as varchar(100)='b,e'; 

가 지금은 "D A, C,"

+1

쉼표로 구분 된 값과 SQL이 함께 잘 작동하지 않을 경우에는 ... 동의 – jarlh

+0

, 당신은 그 구성 요소에 밖으로 이러한 문자열을 분할하고 완전 외부처럼 뭔가를하고 싶은거야 –

+0

이 조인 쉼표 사이의 값과 만 관련이 있다고 대답하십니까? 왜냐하면 String1의 값을 String2에서 제거하면 'a, c, d'가됩니다. (마지막 쉼표로) –

답변

3

두 문자열이 그 부분으로 분할되어야하기 두 문자열의 차이를 원한다. SQL Server 2008에서는 XML 방식을 사용하는 것이 가장 좋습니다.

관심 : 데이터가 <>öä@€& 같은 문자를 금지하고 예처럼 그냥 일반 라틴어 문자를 포함 할 수 있다면, 당신은 ...

나머지 몇 가지 추가적인 노력이 필요할 것은 매우 간단합니다 : 그냥 가져 @String1의 모든 부분은 @String2에 없습니다.

연결 한 문자열입니다 - 다시 -

이 시도 XML을 통해 수행 할 최고의 :

Declare @String1 as varchar(100)='a,b,c,d,e'; 

Declare @String2 as varchar(100)='b,e'; 

WITH FirstStringSplit(S1) AS 
(
    SELECT CAST('<x>' + REPLACE(@String1,',','</x><x>') + '</x>' AS XML) 
) 
,SecondStringSplit(S2) AS 
(
    SELECT CAST('<x>' + REPLACE(@String2,',','</x><x>') + '</x>' AS XML) 
) 

SELECT STUFF(
(
    SELECT ',' + part1.value('.','nvarchar(max)') 
    FROM FirstStringSplit 
    CROSS APPLY S1.nodes('/x') AS A(part1) 
    WHERE part1.value('.','nvarchar(max)') NOT IN(SELECT B.part2.value('.','nvarchar(max)') 
                FROM SecondStringSplit 
                CROSS APPLY S2.nodes('/x') AS B(part2) 
               ) 
    FOR XML PATH('') 

),1,1,'') 
+0

다음 오류가 발생합니다 : [Microsoft] [ODBC SQL Server Driver] [SQL Server ] 다음 SET 옵션의 설정이 잘못되어 선택에 실패했습니다 : 'QUOTED_IDENTIFIER'. SET 옵션이 계산 된 열 및/또는 필터링 된 인덱스 및/또는 쿼리 알림 및/또는 XML 데이터 형식 메서드 및/또는 공간 인덱스 작업에서 인덱싱 된 뷰 및/또는 인덱스에 사용하기에 적합한 지 확인하십시오. (42000,1934) –

+0

@ahmedabdelqader , 여기서 뭐가 문제 야? 이것을 '켜기'로 설정하려고 했습니까? 당신이 [이 읽을 수 있습니다 (http://stackoverflow.com/q/1137821/5089204). 특히 긴 periode를 통해 스크립트로 업그레이드 된 오래된 데이터베이스의 경우 일부 옵션의 기본 설정에 문제가있을 수 있습니다. * 현대 * 값으로 업그레이드 된 곳은 ... – Shnugo

+0

QUOTED_IDENTIFIER를 ON으로 설정하면 모든 것이 괜찮다. 고마워. 그것을 투표했다 :) –

0

먼저 Parse comma-separated string to make IN List of strings in the Where clause

그런 다음 다음 쿼리를 사용하여 다음 링크에서 기능을;

Declare @String1 as varchar(100)='a,b,c,d,e'; 

Declare @String2 as varchar(100)='b,e'; 

SELECT 
    s1.val 
    ,s2.val 
FROM [dbo].[f_split](@String1,',') s1 
FULL OUTER JOIN [dbo].[f_split](@String2,',') s2 
    ON s1.val = s2.val 
WHERE s1.val IS NULL 
    OR s2.val IS NULL 

다음 결과를 얻을 수 있습니다.

val val 
a NULL 
c NULL 
d NULL 
1

흥미로운 작업은 비즈니스 요구 사항입니까?

Declare @String1 as varchar(100)='a,b,c,d,e'; 
SET @String1=REPLACE(@String1,',','') 

Declare @String2 as varchar(100)='b,e'; 
SET @String2=REPLACE(@String2,',','') 

;WITH StringOne AS (

    SELECT CAST('' AS VARCHAR(1)) AS ch, 1 as cnt 
    UNION ALL 
    SELECT CAST(SUBSTRING(@String1,cnt,1) AS VARCHAR(1)) AS ch, cnt+1 as cnt 
    FROM StringOne 
    WHERE cnt <= LEN(@String1) 
),StringTwo AS (

SELECT CAST('' AS VARCHAR(1)) AS ch, 1 as cnt 
UNION ALL 
SELECT CAST(SUBSTRING(@String2,cnt,1) AS VARCHAR(1)) AS ch, cnt+1 as cnt 
FROM StringTwo 
WHERE cnt <= LEN(@String2) 
),ExceptOperation AS(

    SELECT ch FROM StringOne 
    EXCEPT 
    SELECT ch FROM StringTwo 
) 

SELECT STUFF((SELECT ','+ ch FROM ExceptOperation FOR XML PATH('')),1,1,'') 
+1

나는 똑 바른 접근을 좋아한다. 하지만 솔직히 말하면,'a, b, c '는 그저 하나의 예일 뿐이므로 하나의 글자 수에 대해 이것을 처리 할 수 ​​없다고 생각합니다 :-) 어쨌든 +1 – Shnugo

관련 문제