首页 > 解决方案 > SQL 在 C# 之间选择带有 OR 的过滤器

问题描述

我有一个窗口应用程序,将列的一些值显示为复选框,例如:列名“DD_14:你搜索工作了吗?” 所以答案是和否是复选框。

我想要的是查看从 DD_14 中选择“是”或从另一列中选择“否”的案例分布,例如 DD_15。

我只需要编辑查询,但它是这样写的:

string sql_filter_part1 = "";
if (cb_DD_14_A_DESC_Yes.Checked)
{
    sql_filter_part1 = sql_filter_part1 + " " + @"""DD_14_A_SEQ_NO""::int=1 ";
}
if (cb_DD_14_A_DESC_No.Checked)
{
    sql_filter_part1 = sql_filter_part1 + " " + @"""DD_14_A_SEQ_NO""::int=2 ";
}
if (cb_DD_14_A_DESC_NotSelected.Checked)
{
    sql_filter_part1 = sql_filter_part1 + " " + @"""DD_14_A_SEQ_NO"" is null ";
}

if (sql_filter_part1.Length > 0)
{
    sql_filter_part1 = sql_filter_part1.Trim();
    sql_filter_part1 = sql_filter_part1.Replace("  ", " or ");
    sql_filter_part1 = "(" + sql_filter_part1 + ")";
}

和其他专栏:

string sql_filter_part2 = "";
if (cb_DD_14_B_DESC_1.Checked)
{
    sql_filter_part2 = sql_filter_part2 + " " + @"""DD_14_B_SEQ_NO""::int=1 ";
}
if (cb_DD_14_B_DESC_2.Checked)
{
    sql_filter_part2 = sql_filter_part2 + " " + @"""DD_14_B_SEQ_NO""::int=2 ";
}
if (cb_DD_14_B_DESC_3.Checked)
{
    sql_filter_part2 = sql_filter_part2 + " " + @"""DD_14_B_SEQ_NO""::int=3 ";
}
if (cb_DD_14_B_DESC_4.Checked)
{
    sql_filter_part2 = sql_filter_part2 + " " + @"""DD_14_B_SEQ_NO""::int=4 ";
}
if (cb_DD_14_B_DESC_NotSelected.Checked)
{
    sql_filter_part2 = sql_filter_part2 + " " + @"""DD_14_B_SEQ_NO"" is null ";
}
if (sql_filter_part2.Length > 0)
{
    sql_filter_part2 = sql_filter_part2.Trim();
    sql_filter_part2 = sql_filter_part2.Replace("  ", " or ");
    sql_filter_part2 = "(" + sql_filter_part2 + ")";
}
sql_filter = sql_filter_part1 + " " + sql_filter_part2 + " " + sql_filter_part3 + " " + sql_filter_part4 + " " + sql_filter_part5;

并将它们保存到类中,选中复选框后,该类将在程序中运行。

所以重点是我想查看过滤器是用户在第 1 列中检查是还是在第 2 列中检查是。

标签: c#sqlasp.net

解决方案


使用面向对象的原则,您可以(并且应该)做很多事情来清理代码并减少重复和出错的可能性。但我认为可以使这样的事情起作用:

var parts = new[] 
  {
    sql_filter_part1,
    sql_filter_part2,
    sql_filter_part3,
    sql_filter_part4,
    sql_filter_part5
  };
var activeParts = parts.Where(p => !string.IsNullOrWhitespace(p));
sql_filter = string.Join(" or ", activeParts);

推荐阅读