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
の列に先頭のスペースがあると思います(推測すると)。これをデバッグするために
、その値を検査するために、出力の追加の列...
SELECT a.id
, a.remarks
, LEFT(a.remarks,6)
, HEX(a.remarks)
FROM master_listing a
WHERE a.id = 1
remarks
値は先頭にスペースがある場合、LEFT(remarks,6)
は' 11223'
に評価し、数値コンテキストで比較されます、は112233
と等しくありません。
'SELECT b.UID'の代わりに' SELECT * 'を実行したときの出力は何ですか?それはデバッグに役立つかもしれません。 – Pang
LEFTは文字列を返しますが、私の推測はcouriercodeは文字列ではありませんか?したがって、LEFT(a.remarks、6)を宅配番号と同じデータ型に変換する必要があります。キャストを試みますか? – MageeWorld
@Pang同じ結果がNULLですが、 '' ON''で 'a.remarks = b.courierCode'を使っているだけです。 –