2014-04-24 3 views
1

문자열을 비교할 때 마지막 문자를 무시 : 비교할 때내가 비교하려는 문자열을 다음 한

DECLARE @a VARCHAR(20), @b VARCHAR(20) 

SET @a = '05Y2203-B10' 
--SET @a = '05Y2203-B10B' 
SET @b = '05Y2203-B10C' 

, 나는 마지막 문자를 무시해야하지만, - 후 문자열의 길이가 4 인 경우에만.

'05Y2203-B10B' --ignore the 'B' 
'05Y2203-B10' --do not ignore the '0' 

몇 가지 예 :

'05Y2203-B10B' = '05Y2203-B10B' --match 
'05Y2203-B10B' = '05Y2203-B10C' --match 
'05Y2203-B10' = '05Y2203-B10B' --match 
'05Y2203-B10' = '05Y2203-B11' --no match 
'05Y2203-B10' = '18G9987-B10' --no match 

문자열은 항상 같을 것 다음 패턴 중 하나입니다.

- 이전의 부분 문자열 길이는 다를 수 있습니다.

SELECT 1 
WHERE CASE WHEN LEN(SUBSTRING(@a, CHARINDEX('-', @a) + 1, 4)) = 4 
      THEN SUBSTRING(@a, 1, LEN(@a) - 1) 
      ELSE @a 
     END 
     = 
     CASE WHEN LEN(SUBSTRING(@b, CHARINDEX('-', @b) + 1, 4)) = 4 
      THEN SUBSTRING(@b, 1, LEN(@b) - 1) 
      ELSE @b 
     END 

이 작동하지만 쿼리에 더 많은 조건이 특히, 매우 읽기 아니다 :

지금까지 나는이 해결책을 가지고 있습니다.

이 문제에 대한 좀 더 간단하고 세련된 해결책이 있습니까? 난 당신이, 더 읽기 (유지 보수) 쿼리를 원하는 알고있는 것처럼

+0

첫 번째 부분 ('-' 이전)은 어떨까요? 고정 길이입니까? –

+0

'-'이전의 길이가 다를 수 있습니다. – NePh

+1

더 우아한 방법은 물론 더 좋은 테이블 디자인이 될 것입니다 :-) '05Y2203-B10'이 코드이고 'B'가 선택적인 확장 인 경우이 코드는 연결된 코드를 포함하는 하나의 열이 아니라 두 개의 개별 열이어야합니다 '05Y2203-B10B'. –

답변

2

- 뒤에 오는 하위 문자열의 길이가 3 또는 4이므로 - 이후에만 3자를 가져옵니다. 다음은 코드 스 니펫

LEFT(@a, CHARINDEX('-', @a) + 3) = LEFT(@b, CHARINDEX('-', @b) + 3) 
2

그래서 당신은 필요에 대한

또한 그 기능의 복잡성을 모두 원하는 문자열의 일부를 반환하고 숨길 수있는 간단한 스칼라 값 함수를 작성할 수있는 경우 성능을 향상 시키려면이 트림 된 데이터에 대해 또 다른 computed column을 정의하고 후행 데이터없이 해당 기능을 사용하여 저장하십시오.
열을 PERSISTED으로 표시하면 열이 실제로 저장됩니다.
쿼리를 실행할 때이 열을 사용하십시오.

+0

동의합니다. 제거는 T-SQL에서 우아하게 수행 할 수 없으므로 수행 할 함수를 작성하십시오. (Oracle에서는 RTRIM을 사용하여 후행 문자를 제거하지만 T-SQL의 RTRIM은 공백 문자 만 제거 할 수 있습니다.) –