MySql LEFT JOIN ON(前6个字母)

时间:2016-10-05 03:33:51

标签: 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

courier_information表

 id      courierCode   UID
  1         112233      27

不幸的是我上面的查询无效,它返回NULL。

有没有办法做到这一点?

提前致谢。

2 个答案:

答案 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)