0

我在使用 LIKE 子句的 SELECT 查询时遇到了一些问题。我需要获取在某个字段中具有类别 ID 的所有记录。所有类别 ID 的存储方式如下:

1;2;4;11;12;22;32;

发生的事情是以下查询

SELECT * FROM mytableWHERE catidsLIKE '%2;%'

将选择类别 id 为 2 的所有记录,以及类别 12、22、32 等的记录。不幸的是,用于存储类别 id 的代码不可修改,数字 2 是从变量中读取的。我尝试在它旁边使用 NOT LIKE 子句,但我不能重复 10 次以避免 12、22、32、42 等...

有谁知道告诉子句 LIKE 获取任何可以为空的 % 或 ; 但不是一个数字?因为如果在上面的示例中要获取的类别 id 为 1,则字符串将以数字 1 开头(因此左侧不会有 ;),但它也会获取 11。

谢谢

4

3 回答 3

3

The proper solution is to redesign your tables and normalize that field, so you store those IDs in a sub-table, one ID per record. Then your problem goes away.

Failing that, you'll need an ugly WHERE clause to handle all possible cases:

WHERE
      catids = 2             // the only ID in the field
   OR catids LIKE '2;%'      // ID is at the START of the id list
   OR catids LIKE '%;2;%'    // ID is somewhere in the MIDDLE of the list
   OR catids LIKE '%;2'      // ID is at the END of the list

If you had a properly normalized design, the clause would simply be

WHERE subtable.catids = 2
于 2013-05-22T14:58:03.090 回答
0

我第二(和第三)您需要重新设计表格的想法。也就是说,您还可以执行以下操作:

WHERE CONCAT(';', catids, ';') LIKE '%;2;%'
于 2013-05-22T15:05:57.223 回答
0

尝试使用 REGEXP... 之类的...

SELECT * FROM mytable WHERE catids REGEXP '(\d|;|^)2;'
于 2013-05-22T15:17:00.400 回答