SQL选择在c#之间带有OR的过滤器



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

我想要的是查看从DD_14中选择yes,或从另一列(例如DD_15)中选择No的情况的分布。

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

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列选中是

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

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);

最新更新