mysql 如何在SQL where子句中循环遍历数组?

8fsztsew  于 2023-02-15  发布在  Mysql
关注(0)|答案(3)|浏览(271)

我有一个MySQL表,其中包含以下列和记录:

| Name | Total    | GivenBy      | 
| ---- | -------- | ------------ |
| Z    | 200      |['A','B','C'] |
| X    | 240      |['A','D','C'] |

我想在第3列的基础上提取记录1,其中SQL查询如下所示:

SELECT * FROM mytable WHERE GivenBy='B';

有没有一种方法可以循环遍历第三列中的列表,并在单个查询中取出SQL WHERE子句中所需的相应字符串?
请注意,我无法在表中添加更多列。
如果你能提供MySQL兼容的查询,我将不胜感激。

dohp0rv5

dohp0rv51#

您显示的“数组”不是完全有效的JSON,但是如果您使用双引号而不是单引号,则可以使用JSON_TABLE()来完成此操作:

CREATE TABLE MyTable
(
    Name CHAR(1) PRIMARY KEY,
    Total INT NOT NULL,
    GivenBy JSON NOT NULL
);

INSERT INTO MyTable VALUES
('Z', 200, '["A","B","C"]'),
('X', 240, '["A","D","C"]');

SELECT Name, Total, g.Value
FROM MyTable
CROSS JOIN JSON_TABLE(GivenBy, '$[*]' COLUMNS(Value CHAR(1) PATH '$')) AS g;

+------+-------+-------+
| name | total | value |
+------+-------+-------+
| X    |   240 | A     |
| X    |   240 | D     |
| X    |   240 | C     |
| Z    |   200 | A     |
| Z    |   200 | B     |
| Z    |   200 | C     |
+------+-------+-------+

但是最好的选择不是在MySQL中存储“数组”,而是在第二个表中每行存储一个值。

k97glaaz

k97glaaz2#

您可以在regex中使用“like”关键字来匹配第三列中的需求。
从给定的表格中选择 *,如“%B%";
类似的方法也可以。

vs3odd8k

vs3odd8k3#

您需要运行一个脚本:
1.使用以下查询检索GivenBy列中的唯一值列表:

SELECT DISTINCT JSON_EXTRACT(GivenBy, '$[*]') AS GivenByValues
  FROM mytable;

1.循环遍历唯一值列表,对于每个值,运行在WHERE子句中使用该值的查询:

SELECT *
  FROM mytable
 WHERE JSON_SEARCH(GivenBy, 'one', [current_value_from_loop]) IS NOT NULL;

相关问题