我希望以这种方式过滤包含带有连接整数的列的表中的项目:
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
未定义分隔项目的长度。
答案 0 :(得分:0)
首先,Juergen D.是绝对正确的:你首先通过在一个列中引入多个值来引入这个问题来为数据库戴上手铐。
那就是说,除了简单的演讲之外,我想在短期内提供帮助。 :)所以我们走了。
我们将使用优秀的user-defined SPLIT_STR() function by Luis Rodriguez,如下所示:
namespace ColorApp
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnRed_Click(object sender, RoutedEventArgs e)
{
((App)Application.Current).appColors.appColor = Colors.Red;
}
private void btnGreen_Click(object sender, RoutedEventArgs e)
{
((App)Application.Current).appColors.appColor = Colors.Green;
}
private void btBlue_Click(object sender, RoutedEventArgs e)
{
((App)Application.Current).appColors.appColor = Colors.Blue;
}
private void btnNewWindow_Click(object sender, RoutedEventArgs e)
{
}
}
}
现在,我编写了另一个函数,它将遍历表中每个字符串的分隔值,并沿途调用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, '');
,并检查每个值以查看它是否低于指定的最小值({在您的示例中为{1}}或高于最大值(示例中为SPLIT_STR()
):
0
让我为你分解一下。您传入有问题的分隔字符串(10
),分隔符(CREATE FUNCTION check_vals (
x varchar(255),
delim varchar(12),
mini int,
maxi int
)
RETURNS bool
BEGIN
declare len, pos int;
declare val int;
set len = length(x) - length(replace(x,'|',''));
set pos = 1;
WHILE pos <= len DO
set val = split_str(x, delim, pos);
IF val < mini or val > maxi THEN
return false;
END IF;
set pos = pos + 1;
END WHILE;
RETURN true;
END //
),允许的最小值(x
)和允许的最大值(|
)
mini
这将获取给定字符串maxi
中的标记或分隔值的总数。这告诉我们的while循环循环多少次。
set len = length(x) - length(replace(x,'|',''));
这将获得每个标记的实际值(在您的示例中:第一个记录为3,7,2,10,9)。
x
如果给定值低于最小值或高于允许的最大值,我们退出函数并返回FALSE。
set val = split_str(x, delim, pos);
如果我们到达IF val < mini or val > maxi THEN
return false;
END IF;
,则表示每个值都通过了测试,并且记录整体符合您的标准。
因此,对于最小值为0且最大值为10的检查示例,您可以调用类似的内容:
END WHILE;
RETURN true;
哪能得到你
RETURN true