MySQL过滤范围内的分隔项列表的列

MySQL过滤范围内的分隔项列表的列,mysql,Mysql,我希望以以下方式筛选表中包含列的项: 3|7|2|10|11 我只希望得到包含特定范围的结果,如: [0 - 10] return result for 3|7|2|10|9 [0 - 10] don't return result for 13|7|2|10|9 未定义分隔项的长度。首先,Juergen D.是绝对正确的:您首先在一个列中引入多个值,从而限制了数据库 也就是说,除了简单的讲课之外,我还想在短期内提供帮助。:)我们开始吧 我们将使用优秀的,如下所示: CREATE FUNC

我希望以以下方式筛选表中包含列的项:

3|7|2|10|11
我只希望得到包含特定范围的结果,如:

[0 - 10] return result for 3|7|2|10|9
[0 - 10] don't return result for 13|7|2|10|9

未定义分隔项的长度。

首先,Juergen D.是绝对正确的:您首先在一个列中引入多个值,从而限制了数据库

也就是说,除了简单的讲课之外,我还想在短期内提供帮助。:)我们开始吧


我们将使用优秀的,如下所示:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');
现在,我编写了另一个函数,该函数将遍历表中每个字符串的分隔值,同时调用
SPLIT_STR()
,并检查每个值是否低于指定的最小值(示例中为
0
),或高于最大值(示例中为
10
):

它获取给定字符串
x
中标记或分隔值的总数。这告诉我们while循环要循环多少次

set val = split_str(x, delim, pos);
这将获取每个令牌的实际值(在您的示例中:3、7、2、10、9,用于第一条记录)

如果我们得到
返回true
,这意味着每个值都通过了测试,并且记录总体上符合您的标准


因此,对于最小值为0,最大值为10的检查示例,您可以调用如下内容:

select str, check_vals(str,'|',0,10) `result` from t;
那会让你

|         str | result |
|-------------|--------|
|  3|7|2|10|9 |   true |
| 13|7|2|10|9 |  false |

切勿在一列中存储多个值!好帖子。。。谢谢大家!最后,我在一个新表中分隔了我的值。。。
IF val < mini or val > maxi THEN
  return false;
END IF;
END WHILE;
RETURN true;
select str, check_vals(str,'|',0,10) `result` from t;
|         str | result |
|-------------|--------|
|  3|7|2|10|9 |   true |
| 13|7|2|10|9 |  false |