【问题标题】:Sql Multiple Conditions MethodSql 多条件方法
【发布时间】:2013-07-13 02:10:38
【问题描述】:

我一直在尝试找到一种在 Sql 中使用多个条件的方法,目前我正在使用实体框架。很有可能这是实现我想要的唯一方法,但我想知道是否有人知道更有效的方法。

基本上,我使用标准来查找数据库中应该选择的下一行。例如,让我们使用以下 2 个条件:

1) 字段1 = A;

2) 字段2 = B;

所以在下表中:

| RowId | Field1 | Field2 |

| 0001  |     A     |  B |

| 0002   | B | B |

| 0003 | C | C |

| 0004 | A | C |

我需要按以下顺序单独选择每一行:

0001 - Both Condtions Satisfied,

0004 - Condition 1 Satisfied,

0002 - Condition 2 Satisfied,

0003 - No conditions satisfied

目前我正在做以下事情

public TestObj GetNextObj()
{
    using (TestDb testDb = new TestDb())
    {
        TestObj testObj = (from o in testDb.TestTable
                           where o.Field1 == A && o.Field2 == B
                           select o).FirstOrDefault();

        if (testObj != null)
           return testObj;

        testObj = (from o in testDb.TestTable
                           where o.Field1 == A
                           select o).FirstOrDefault();

        if (testObj != null)
           return testObj;

        testObj = (from o in testDb.TestTable
                           where o.Field2 == B
                           select o).FirstOrDefault();

        if (testObj != null)
           return testObj;

        testObj = (from o in testDb.TestTable
                           select o).FirstOrDefault();

         return testObj;
    }
}

这没问题,但是我想允许在表格中定义条件,我担心当条件数量增加时,此过程将开始花费很长时间。

还有其他方法可以做我在这里尝试的事情吗??

谢谢。

编辑:::::

现在使用以下代码按照另一个表定义的顺序从表中选择项目::

public static SortTest GetRow()
    {
        using (TestDb testDb = new TestDb())
        {
            SortParam[] sortParams = (from sp in testDb.SortParams
                                      orderby sp.Priority ascending
                                      select sp).ToArray();

            if (sortParams.Length == 0)
            {
                SortTest sortTest = (from st in testDb.SortTests
                                     orderby st.RowId ascending 
                                     select st).FirstOrDefault();
                Console.WriteLine("Short route");
                return sortTest;
            }

            Console.WriteLine("Long route");

            StringBuilder sqlQueryBuilder = new StringBuilder();

            sqlQueryBuilder.Append("SELECT * FROM [Proto].[dbo].[SortTests] ORDER BY \n");

            foreach (SortParam sortParam in sortParams)
            {
                sqlQueryBuilder.Append("CASE WHEN " + sortParam.FieldName + " LIKE '%" + sortParam.FieldValue + "%' THEN 1 ELSE 2 END,\n");
            }

            sqlQueryBuilder.Append("\nRowId"); //By default use row Id
            DbSqlQuery<SortTest> dbSqlQuery = testDb.SortTests.SqlQuery(sqlQueryBuilder.ToString());
            return dbSqlQuery.FirstOrDefault();
        }
    }

我可能必须更改 thigns 以防止 Sql Injection,但这目前有效。

谢谢!

【问题讨论】:

    标签: c# sql entity-framework query-optimization


    【解决方案1】:

    有一种简单的方法可以在 SQL 中的单个查询中完成:

    select *
    from o
    order by case Field1 when 'A' then 1 else 2 end,
             case Field2 when 'B' then 1 else 2 end,
             RowId
    

    【讨论】:

    • 你的建议很好!如果值比“A”、“B”、“C”更复杂,也可以使用“解码”之类的东西或编写一个返回 1/2 的函数
    • @AKDADEVIL:解码特定于 Oracle - 我认为 OP 可能正在使用 SQLServer,基于他在其他问题上的标签。
    • 你可能是对的。好吧,既然我已经赞成你的回答,我不会以任何方式感到内疚...... ;)
    • 谢谢,效果很好。反正有没有使用这样的东西:...CASE Field1 LIKE 'A%' THEN 1 ELSE 2 END...
    • 抱歉,我现在正在使用:...CASE WHEN Field1 LIKE 'A%' THEN 1 ELSE 2 END, ...
    猜你喜欢
    • 2019-05-05
    • 2020-07-25
    • 1970-01-01
    • 2022-01-19
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多