根据条件丢弃SQL结果行

时间:2016-05-29 19:18:04

标签: c# sql-server-2008 logic

我有以下数据:

Ord_Act_Deliv_DateTime  TrmnlGrp_Key    Ord_CustLoc_Key Ord_Driver_Key     Ord_Inv_No    Credits
2016-04-01 11:00:00     3               429             93                 INV-00055295  True
2016-04-01 11:00:00     3               135             93                 INV-00055295A False
2016-04-01 11:00:00     3               429             93                 INV-00055295C False

我想要完成的事情如下

if credits = true
set @temp_invoice_no = Ord_inv_No + 'C'

SELECT * FROM Orders WHERE Ord_Inv_No NOT IN (original inv no with credit, inv no + 'C')

我可能在我选择的日期范围内有很多这样的记录,我需要确保原始和信用不会进入最终结果集。从我到目前为止的研究来看,看起来大多数建议使用CASE进行简单的比较(我认为这不适合这种情况)或IF指定单独的select语句,其中包含在语句中传递或声明的变量。也许我误解了CASE和IF的功能。请帮忙,我被困了。

我也可以在C#中探索这个,但我在那里仍然相当绿。我已经在DataTable中得到了结果,但是对表进行评估并不是我已经弄清楚除了将每行抛出到字符串之外的其他方法。

2 个答案:

答案 0 :(得分:0)

因此,您有一组记录,其中要关注的列是Ord_Inv_NoCredits

第一点,您正在设置一个临时变量,您似乎没有做任何事情。

至于选择查询

 SELECT * FROM Orders WHERE Ord_Inv_No NOT IN (original inv no with credit, inv no + 'C')

我在original inv no with credit, inv no + 'C'中看到的唯一区别是它的Credits列值设置为True(从第一位开始)。如果是这种情况,此查询应该适合您:

SELECT * FROM Orders WHERE Credits=true

答案 1 :(得分:0)

我最终在C#中执行了以下操作:

 foreach(DataRow row in results.Rows)
        {
            credit = Convert.ToBoolean(row["Credits"].ToString());
            if(credit)
            {
                if (String.IsNullOrWhiteSpace(selectString))
                {
                    tempString = row["Ord_Inv_No"].ToString();
                    selectString = String.Format("'{0}', '{0}C'",tempString);
                }
                else
                {
                    tempString = row["Ord_Inv_No"].ToString();
                    selectString += String.Format(", '{0}', '{0}C'", tempString);
                }

            }
        }

        // The following three lines are for troubleshooting, shows the items being selected out and the initial count.
        // If DriverKey is 9 and dates are 5-2-16 - 5-8-16 String should show to INV numbers and count should be 19
        if (!String.IsNullOrWhiteSpace(selectString))
            MessageBox.Show(selectString);
        MessageBox.Show(results.Rows.Count.ToString());
        // only process if string is not empty, need code

        if (!String.IsNullOrWhiteSpace(selectString))
        {
            try
            {
                var rows = results.Select("Ord_Inv_No IN (" + selectString + ")");
                foreach (var row in rows)
                    row.Delete();
                results.AcceptChanges();
                // This is for troubleshooting, gets the final number of rows after edits 
                // If DriverKey is 9 and dates are 5-2-16 - 5-8-16 final count should be 17
                MessageBox.Show(results.Rows.Count.ToString());
                results.Columns.Remove("Credits");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }