选择连接输出不完全匹配[MySQL]

时间:2016-08-23 14:04:38

标签: mysql select join

任何人都可以解释为什么查询:

select rma.id, history_transactions.reference 
from history_transactions 
join rma on history_transactions.reference = rma.id

返回:

id     | reference
100144 |    100144
102299 |    102299a
100316 |    100316AFEN1

不能让它只显示100%匹配,所以只有第一行。如果有人能够解释它为什么会发生,那就太好了。

3 个答案:

答案 0 :(得分:2)

显然rma.id列是数字(整数),而引用字段是文本的,因为它也包含文本。

正如Type Conversion in Expression Evaluation上的MySQL文档所述,如果将文本与数字进行比较,则比较为浮点数,这意味着参考字段将转换为数字。

MySQL通过从左到右评估字符串将字符串转换为数字,只要章程可以解释为数字。如果遇到无法作为数字计算的字符,则MySQL停止评估并返回前面的字符作为数值。

如果是第二条记录,则字母a是第一个无法评估为数字的字符,因此'102299a'字符串的数值为102299。同样的逻辑适用于第3条记录。

要强制MySQL仅返回完全匹配,请使用查询中的cast() or convert()函数将rma.id显式转换为字符串。这样,比较将以字符串形式完成,而不是浮点数。

答案 1 :(得分:1)

原因很可能是隐式类型转换。我的猜测是id字段属于integer类型,而reference字段属于varchar类型。因此,比较MySQL将varchar转换为数字。所以,例如值'10299a'转换为10299然后id字段的对应值进行比较。

Live demo of the issue

答案 2 :(得分:0)

隐式数据类型转换。

我怀疑id列被声明为numeric数据类型。最有可能是INT

reference列声明为字符类型。最有可能是VARCHAR

要进行相等比较,MySQL无法将“字符串”与“数字”进行比较。

所以MySQL隐含地将字符串值转换为数字,然后进行数值的比较。

如果字符串不是有效数字,其他数据库会抛出错误。

但是MySQL允许转换(没有错误或警告。)

作为演示,这些表达式会导致MySQL将字符串隐式转换为数字:

SELECT '123ABC' + 0 
     , '4D5E6F' + 0 
     , 'G7H8I9' + 0

根据您的值,例如

SELECT '100316AFEN1' + 0 

我们看到MySQL返回一个用于比较的数值100316。