2016-11-08 15 views
-2

这是行选项columnoc_cart选择INT列,并将其与JSON数组列比较

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

在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?

+0

问题通过使用FIND_IN_SET解决 –

+0

谢谢MR.Bill –