我尝试过使用' LIKE'但它遇到了一些问题,我将在下面解释。
我有一个字符串列,看起来像这些。 " 1010,2020,3030" " 1010" ""
我希望能够看到此字符串是否包含单个ID。例如2020.如果确实如此,则返回该行。我尝试使用like,但如果id为20,它将返回行,因为2020包含20.
选择整个数据库,然后使用分隔符遍历所有字符串将花费太多时间。有可能实现这个吗?
答案 0 :(得分:4)
这就是您不在单个字段中存储多个值的原因。因为你的设计不好,这就是你必须使用每个单一时间来补偿它的查询结构:
WHERE
foo = 2020 // exact match, only value in field
OR foo LIKE '2020,%' // value is at start of field
OR foo LIKE '%,2020,%' // value is somewhere in the middle of the field
OR foo LIKE '%,2020' // value is at the end of the field
或者你可以有一个正确的标准化设计,刚刚完成
WHERE childtable.foo = 2020
并完成它。
答案 1 :(得分:3)
首先,您不应该在字符串变量中存储事物列表。 SQL为列表提供了非常好的数据结构。它被称为表。这样一个表中的每一行都有一个id和列表中的一个值。
那就是说,有时你会被这样的数据所困扰。在这种情况下,您可以使用find_in-set()
:
where find_in_set('20', replace(stringcolumn, ', ', ',')) > 0;
您也可以使用like
执行逻辑,但MySQL具有方便的内置功能。</ p>
编辑:
如果您想使用like
执行此操作:
where concat(',', stringcolumn, ',') like '%,20,%'
请注意,分隔符&#34;保护&#34;这些值,因此20
不会与2020
混淆。