这是表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
答案 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?
的回答