选择int列并将其与Json数组列进行比较

时间:2016-11-08 23:14:44

标签: mysql

这是表column

中选项oc_cart中的行
20,228,27,229

为什么当值为228时没有找到结果但是当值为20时发现结果如下:

select 1 from dual
where  228 in (select option as option from oc_cart)

,当我将值更改为20时找到结果

select 1 from dual
where 20 in (select option as option from oc_cart)

option列数据类型为TEXT

1 个答案:

答案 0 :(得分:1)

在SQL中,这两个表达式是不同的:

WHERE 228 in ('20,228,27,229')

WHERE 228 in ('20','228','27','229')

第一个示例将整数228与单个字符串值进行比较,其前导数字字符可以转换为整数20.这就是发生的情况。将228与20进行比较,然后失败。

第二个示例将整数228与四个值的列表进行比较,每个值可以转换为不同的整数,228匹配第二个整数228.

您的子查询返回单个字符串,而不是值列表。如果您的oc_cart.option包含一个字符串,则无法以您的方式使用IN( )谓词。

解决方法是:

WHERE FIND_IN_SET(228, (SELECT option FROM oc_cart WHERE...))

但这很尴尬。如果要在字符串中搜索单个数字,则实际上不应该存储逗号分隔数字的字符串。请参阅我对Is storing a delimited list in a database column really that bad?

的回答