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
courier_information表
id courierCode UID
1 112233 27
不幸的是我上面的查询无效,它返回NULL。
有没有办法做到这一点?
提前致谢。
答案 0 :(得分:3)
如果没有"匹配"那么NULL值将是 b.anycolumn
操作中a LEFT JOIN b
的预期回报。在b
中找到的行。 (将返回a
中的行,并且MySQL将为b
中的所有列返回NULL值。)
看起来你在问为什么来自b
的行没有匹配;比较测试为什么不为任何行返回TRUE。
您省略的是courierCode
列的数据类型。
鉴于条件 a.remarks = b.courierCode
的查询确实找到了匹配的行,并且我们在remarks
列中显示的示例值为'112233GOODAY'
,我们推测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
。
答案 1 :(得分:0)
试试这个:
CONVERT(LEFT(a.remarks,6), UNSIGNED INTEGER)