需要从MySQL获取行

时间:2018-08-08 19:47:35

标签: mysql sql

我在MySQL DB的一列中有记录,例如:

ID                           Tax
1                      GST + PST + ABC 
2                      PST + GST + ABC
3                            XYZ
4                      PST + ABC + GST

这些作为varchar存储在DB中。通过我的代码,我需要从数据库中获取与tax =“ GST + PST + ABC”之类的条件匹配的记录

由于查询,我目前只获得第一条记录:

Select * from table where taxes = "GST + PST + ABC";

但是我想从数据库中获取所有记录,无论它们的位置如何,以上三个名称(GST,PST,ABC)都会出现。

因此,如果我符合上述条件,我需要记录:

GST + PST + ABC 
PST + GST + ABC
PST + ABC + GST

我正在使用MySQL DB,请让我知道有什么功能可以根据我的情况实现上述结果

3 个答案:

答案 0 :(得分:2)

我建议这样的事情:

where taxes like '%GST%' and
      taxes like '%PST%' and
      taxes like '%ABC%' and
      length(taxes) = 15;

如果您恰好需要这三个代码,这将测试长度。您还可以测试+的数量:

where taxes like '%+%+%' and taxes not like '%+%+%+%'

或者,如果您只需要这些代码,则不要使用这些条件。

这假定名称是不重叠的(因此没有称为“ GS”或“ ST”的税)。如果可能的话:

where concat(' ', taxes, ' ') like '% GST %' and
      concat(' ', taxes, ' ') like '% PST %' and
      concat(' ', taxes, ' ') like '% ABC %';

答案 1 :(得分:1)

您可以使用OR

SELECT * FROM TABLE WHERE TAXES = "GST + PST + ABC"
OR TAXES = "GST + ABC + PST"
OR TAXES = "PST + GST + ABC"
OR TAXES = "PST + ABC + GST"
OR TAXES = "ABC + GST + PST"
OR TAXES = "ABC + PST + ABC"

这只是可能的一小部分,所以我看不出动态制作复杂SQL会变得棘手的原因。

如果数据可以采用其他格式,并且您想要匹配,例如:"GST + ABC + PST + ZZZ",那么我们可以使用LIKE%

进行一些工作

答案 2 :(得分:1)

我会用

  WHERE NAME REGEXP "GST"
    AND NAME REGEXP "PST"
    AND NAME REGEXP "ABC"

话虽如此,这听起来像是您的数据模型标准化不够的情况。也就是说,您应该将每种税收类型存储在单独的行中,这将使MySQL操作变得更加容易(就像在这种情况下一样)。以您所拥有的格式存储数据不是一个好习惯。我会尝试以这种方式存储它:

ID  ID-sub  TAX
--  ------  ---
1   1       GST
1   2       PST
1   3       ABC
2   1       PST
2   2       GST

可能根本不需要ID-sub。