2016-10-05 2 views
0

LEFT JOIN으로 가능하고 ON에 6 자만 사용할 수 있습니까?MySql LEFT JOIN ON (처음 6 자)

여기 내 코드가 있습니다.

SELECT 
    b.UID 
FROM master_listing AS a 
LEFT JOIN courier_information AS b ON LEFT(a.remarks, 6) = b.courierCode 

master_listing 테이블

id   remarks 
    1   112233GOODAY 

id  courierCode UID 
    1   112233  27 

는 불행하게도 내 위의 쿼리가 작동하지 않습니다 courier_information 테이블은 NULL을 반환합니다.

이렇게 할 방법이 있습니까?

미리 감사드립니다.

+0

'SELECT b.UID' 대신'SELECT *'를했을 때의 결과는 무엇입니까? 디버깅에 도움이 될 수 있습니다. – Pang

+0

LEFT가 문자열을 반환 할 것이고 내 추측은 couriercode가 문자열이 아닌 것입니까? 따라서 'LEFT (a.remarks, 6)'을 택배 코드와 동일한 데이터 유형으로 변환해야합니다. 전송 해보세요. – MageeWorld

+0

@Pang 같은 결과가 NULL이지만, 단지'ON'에서'a.remarks = b.courierCode'를 사용할 때. –

답변

3

NULL 값이 a LEFT JOIN b 작업에서 b.anycolumn에 대한 기대 수익 것, b에서 찾을 수 없습니다 "일치"행이없는 경우. (a의 행이 반환되며, MySQL은 b의 모든 열에 대해 NULL 값을 반환합니다.

b의 행이 일치하지 않는 이유를 묻는 것처럼 보입니다. 비교 테스트가 모든 행에 대해 TRUE를 반환하지 않는 이유는 무엇입니까?

생략 한 내용은 courierCode 열의 데이터 유형 입니다.

이 조건 a.remarks = b.courierCode와 조회가 일치하는 행을 찾을 않는 점을 감안하고, 우리가 '112233GOODAY'remarks 열에있는 값의 예를 나타낸 것을 감안는 remarks 컬럼 캐릭터 타입이라고 추측.

또한 비교가 문자열 값에 이 아닌이라고 결론을 내릴 수 있습니다.

숫자 컨텍스트에서 계산 된 문자열 값 '112233GOODAY'112233의 숫자 값으로 해석됩니다. 따라서 암시적인 데이터 유형 변환이 발생한다는 것을 알고 있으므로 remarks이 숫자로 변환됩니다. 동일한 전환이 LEFT() 함수에서 반환 될 때 발생해야합니다.

데모 설치 :

CREATE TABLE master_listing 
    (id   INT UNSIGNED PRIMARY KEY 
    , remarks  VARCHAR(12) 
); 
    INSERT INTO master_listing (id, remarks) 
    VALUES (1,'112233GOODAY'); 

    CREATE TABLE courier_information 
    (id   INT UNSIGNED PRIMARY KEY 
    , couriercode INT UNSIGNED 
    , uid   INT UNSIGNED 
); 
    INSERT INTO courier_information (id, couriercode, uid) 
    VALUES (1,112233,27); 

데모 쿼리 예상대로

SELECT b.UID 
    FROM master_listing a 
    LEFT 
    JOIN courier_information b 
     ON LEFT(a.remarks, 6) = b.courierCode 
    ; 

출력 :

이 공개되지 않았 음을 계속 뭔가가있다
 UID 
    ------ 
     27 

. 필자는 열의 데이터 유형에 대해 가정했습니다.

내 생각 엔 그냥 짐작하면 remarks 열에 선행 공백이 있다는 것입니다. 값을 검사하기 위해, 출력 추가 열 디버깅

... remarks 값이 선행 공간이 있으면

SELECT a.id 
     , a.remarks 
     , LEFT(a.remarks,6) 
     , HEX(a.remarks) 
    FROM master_listing a 
    WHERE a.id = 1 

는 다음 LEFT(remarks,6)' 11223'로 평가하고, 숫자 관련하여 비교하는 것 가 112233과 같지 않습니다.

+0

멋진 답변을 주셔서 감사합니다 :) –

0

이 시도 :

CONVERT(LEFT(a.remarks,6), UNSIGNED INTEGER) 
+0

감사하지만 작동하지 않습니다. –