2014-01-31 6 views
1
DECLARE @TABLE_A TABLE (ID INT,NAME_A VARCHAR(100),VAL INT) 
INSERT INTO @TABLE_A VALUES(1,'1-06-734-01791/01',900),(2,'NAME2/2/F',100),(3,'NAME3/3',400),(4,'NAME44',80) 

DECLARE @TABLE_B TABLE (ID INT,NAME_B VARCHAR(100)) 
INSERT INTO @TABLE_B VALUES(1,'1-06-734-01791'),(2,'NAME2'),(3,'NAME3'),(4,'NAME4') 

SELECT A.ID,b.NAME_b,A.VAL FROM @TABLE_A AS A 
    INNER JOIN @TABLE_B AS B 
    ON B.NAME_B=SUBSTRING(A.NAME_A,1,CHARINDEX('/',A.NAME_A,1)-1) 

가입 : 나는 like 연산자를하지 않을SUBSTRING 및 CHARINDEX이 다음과 같은 오류를 제공

Invalid length parameter passed to the LEFT or SUBSTRING function.

섹션 join에서는 더 많은 데이터를 반환하기 때문이다.

+0

없습니다. 가입시 NAME_A 및 NAME_B을 조작해서는 안됩니다. 같은 열에 여러 값을 갖는 것은 나쁜 습관입니다. –

+0

이제 샘플 데이터를 어떻게 편집할까요?이 문제를 해결하려면 ... – Singaravelan

답변

4

오류가 발생합니다; 샘플 데이터에서 NAME44NAME4/4으로 바꿀 때 오류가 없음을 알 수 있습니다.

먼저 (슬래쉬가 발견되지 않았 음을 의미한다) CHARINDEX가 0을 반환 여부를 확인하여 코드가 더 강력 할 수 있습니다 : 그것은 테이블을 조인하는 좋은 방법이

INNER JOIN @TABLE_B AS B 
    ON B.NAME_B = CASE WHEN CHARINDEX('/', A.NAME_A, 1) = 0 
        THEN A.NAME_A 
        ELSE SUBSTRING(A.NAME_A, 1, CHARINDEX('/', A.NAME_A, 1) - 1) 
       END 
2

예제 데이터에서 표 A를 대신 사용해야하는 표 B를 사용하는 것으로 보입니다. JOIN에서 주위를 바꾸면됩니다.

보십시오 : 당신의 상태가 슬래시없이 이름에 대한 강력한하지 조인 때문에

DECLARE @TABLE_A TABLE (ID INT,NAME_A VARCHAR(100),VAL INT) 
INSERT INTO @TABLE_A VALUES(1,'NAME1/1/M/L',900),(2,'NAME2/2/F',100),(3,'NAME3/3',400),(4,'NAME4/4',80) 

DECLARE @TABLE_B TABLE (ID INT,NAME_B VARCHAR(100)) 
INSERT INTO @TABLE_B VALUES(1,'NAME1'),(2,'NAME2'),(3,'NAME3'),(4,'NAME4') 

SELECT A.ID,A.NAME_A,A.VAL FROM @TABLE_A AS A 
    INNER JOIN @TABLE_B AS B 
    ON B.NAME_B=SUBSTRING(A.NAME_A,1,CHARINDEX('/',A.NAME_A,1)-1) 
관련 문제