두 문자열이 있는데, SQL에서 두 문자열의 내용간에 차이를 가져오고 싶습니까 ?? 예SQL에서 두 문자열 사이의 차이점을 찾는 방법
,
Declare @String1 as varchar(100)='a,b,c,d,e';
Declare @String2 as varchar(100)='b,e';
가 지금은 "D A, C,"
두 문자열이 있는데, SQL에서 두 문자열의 내용간에 차이를 가져오고 싶습니까 ?? 예SQL에서 두 문자열 사이의 차이점을 찾는 방법
,
Declare @String1 as varchar(100)='a,b,c,d,e';
Declare @String2 as varchar(100)='b,e';
가 지금은 "D A, C,"
두 문자열이 그 부분으로 분할되어야하기 두 문자열의 차이를 원한다. 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,'')
다음 오류가 발생합니다 : [Microsoft] [ODBC SQL Server Driver] [SQL Server ] 다음 SET 옵션의 설정이 잘못되어 선택에 실패했습니다 : 'QUOTED_IDENTIFIER'. SET 옵션이 계산 된 열 및/또는 필터링 된 인덱스 및/또는 쿼리 알림 및/또는 XML 데이터 형식 메서드 및/또는 공간 인덱스 작업에서 인덱싱 된 뷰 및/또는 인덱스에 사용하기에 적합한 지 확인하십시오. (42000,1934) –
@ahmedabdelqader , 여기서 뭐가 문제 야? 이것을 '켜기'로 설정하려고 했습니까? 당신이 [이 읽을 수 있습니다 (http://stackoverflow.com/q/1137821/5089204). 특히 긴 periode를 통해 스크립트로 업그레이드 된 오래된 데이터베이스의 경우 일부 옵션의 기본 설정에 문제가있을 수 있습니다. * 현대 * 값으로 업그레이드 된 곳은 ... – Shnugo
QUOTED_IDENTIFIER를 ON으로 설정하면 모든 것이 괜찮다. 고마워. 그것을 투표했다 :) –
먼저 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
흥미로운 작업은 비즈니스 요구 사항입니까?
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,'')
나는 똑 바른 접근을 좋아한다. 하지만 솔직히 말하면,'a, b, c '는 그저 하나의 예일 뿐이므로 하나의 글자 수에 대해 이것을 처리 할 수 없다고 생각합니다 :-) 어쨌든 +1 – Shnugo
쉼표로 구분 된 값과 SQL이 함께 잘 작동하지 않을 경우에는 ... 동의 – jarlh
, 당신은 그 구성 요소에 밖으로 이러한 문자열을 분할하고 완전 외부처럼 뭔가를하고 싶은거야 –
이 조인 쉼표 사이의 값과 만 관련이 있다고 대답하십니까? 왜냐하면 String1의 값을 String2에서 제거하면 'a, c, d'가됩니다. (마지막 쉼표로) –