获取包含确切文本的行

时间:2016-08-01 10:58:05

标签: mysql sql

我有一个名为Test的表。其中我有3列。看起来像

imei的类型为int,V_Id的类型为int, app_no的类型为text

??

我想获得包含app_no = 25的行。 我使用了包含LIKE和IN的查询。 含义%25% ---但它也会给我记录app_no = 125和app_no = 254的位置。 我也试过" 喜欢app_id =' 25' "但它将排除记录,其中app_id = 14,25。

有没有其他方法可以获得我的欲望记录,其中包含app_id = 25的所有行,包括app_id = 14,25等记录。但不包括app_id = 254,125的记录。

4 个答案:

答案 0 :(得分:4)

首先,您应该修复数据结构。在字符串中存储id列表是一个坏主意,原因有很多:

  • 数字应存储为数字,而不是字符串。
  • 列应具有单个值。
  • 应使用外键关系声明ID。
  • SQL(一般情况下)对字符串函数没有很好的支持。
  • 对字符串的查询不能使用索引,在某些情况下会大幅降低性能。

SQL'ish存储此类数据的方法在一个单独的表中,每imei_no行一行,app_no一行。这将是一个联结表。

有时,我们会遇到其他人非常糟糕的设计决策。在这种情况下,您可以使用find_in_set()

on find_in_set(25, app_no)

答案 1 :(得分:1)

请使用set in set

select * from <table_name> where FIND_IN_SET(app_no,'25')

答案 2 :(得分:1)

使用FIND_IN_SET

SELECT *
FROM test
WHERE FIND_IN_SET('25', app_no) > 0

我相信您也可以仅使用LIKE运算符执行此操作。假设您的应用程序编号的CSV列表没有空格:

SELECT *
FROM test
WHERE app_no LIKE '25' OR
      app_no LIKE '25,%' OR
      app_no LIKE '%,25' OR
      app_no LIKE '%,25,%'

答案 3 :(得分:0)

您还可以使用简单的REGIX:

SELECT
  yourField,
  youtField REGEXP('^25$|^25,|,25$')
FROM youtTable;

<强>样品

MariaDB [yourschema]> SELECT t,t REGEXP('^25$|^25,|,25$') FROM l;
+-------+----------------------------+
| t     | t REGEXP('^25$|^25,|,25$') |
+-------+----------------------------+
| 1     |                          0 |
| 2     |                          0 |
| 1,25  |                          1 |
| 1,125 |                          0 |
| 125,1 |                          0 |
| 25    |                          1 |
| 25,0  |                          1 |
+-------+----------------------------+
7 rows in set (0.00 sec)

MariaDB [yourschema]>