【问题标题】:Search array with logical condition搜索具有逻辑条件的数组
【发布时间】:2016-01-03 20:56:19
【问题描述】:

我有一个整数数组,我必须检查项目是否满足逻辑条件。 例如:

array: [1, 4, 17, 22, 45]
condition: 1 AND 17 AND (22 OR 49)

如何检查数组元素是否满足条件。 我将数组元素作为具有通用标识符的行存储在 DB 中:

ID_1 | 1
ID_1 | 4
ID_1 | 17
ID_1 | 22
ID_1 | 45

如果有人知道如何通过 SQL 检查这些值是否满足条件或跨数组搜索,我将不胜感激。

【问题讨论】:

  • 表的结构是什么。没有数据库的结构,就无法回答这个问题。
  • 您是在问如何为 SELECT 查询编写 WHERE 条件吗?
  • 发票项目列表。每行代表带有标识符(整数值)的项目,我必须检查发票(ID_1)是否具有与逻辑条件相对应的项目。表格有更多列(价格、金额...),但发票 ID 和项目 ID 是用于检查发票项目是否符合条件的字段。
  • 研究使用带有 .Find/.FindAll() 的 List(Of T) 而不是数组。 (或者也许 Array 有一个 Find?我没看。) .Find() 使用一个 lambda,它可以根据需要变得复杂。

标签: sql arrays vb.net logical-operators


【解决方案1】:

可能是这样的:

Module StartupModule

    Sub Main()
        Dim nums() As Integer = {1, 4, 17, 22, 45}

        Dim hasNumbers As Func(Of Integer(), Boolean) = Function(arr)
                                                            Return arr.Contains(1) AndAlso arr.Contains(17) AndAlso (arr.Contains(22) OrElse arr.Contains(49))
                                                        End Function

        Dim result As Boolean = hasNumbers(nums)

        Console.WriteLine(result)

        Console.ReadLine()
    End Sub

End Module

编辑

它不会像刚才读到的那样做任何事情。所以我会使用expression trees

【讨论】:

    【解决方案2】:

    我假设您要查找包含项目 id 1 AND 17 AND (22 OR 49) 的发票。然后就可以了

    SELECT invoice_id 
    FROM items
    WHERE item_id IN (1, 17, 22)
    GROUP BY invoice_id
    HAVING COUNT(*) = 3
    UNION
    SELECT invoice_id 
    FROM items
    WHERE item_id IN (1, 17, 49)
    GROUP BY invoice_id
    HAVING COUNT(*) = 3
    

    仅当item_ids 在每张发票上都是唯一的时才有效。

    【讨论】:

    • 条件可以是任何东西,比如 2 OR (5 AND 7 AND 15) 所以我需要通用方法。我很难将行转换为数组,然后对其应用逻辑条件。
    • 翻译成文字:如果我的发票中有苹果和香蕉,那么我需要在底部添加特定的文字。这可以是任何东西,如果我有(洋葱或大蒜)和鸡蛋,那么我会在底部写“漂亮的炒鸡蛋”
    • 如果将数据读入数组,这根本不是 SQL 问题。但是你的问题到底出在哪里?你不能做类似array.Contains(1) AndAlso array.Contains(17) AndAlso (array.Contains(22) OrElse array.Contains(49))的事情吗?
    • 条件可以是任何东西,用户通过控制台创建条件,他们可以做出任何正确的逻辑表达式。我最后使用包含作为检查条件中的项目是否存在于项目数组中的一部分,但只有在我对这个问题应用反向逻辑之后。
    【解决方案3】:

    我在反向逻辑中找到了解决方案。对于代表一个项目的条件中的每个元素(不是大括号或逻辑操作数,所以整数)我检查它是否是数组元素。如果是,则将其替换为 true,否则替换为 fasle。 所以我得到了这样的东西:

    array: [1, 4, 17, 22, 45]
    original conditions
      condition A: 1 AND 17 AND (22 OR 49)
      condition B: 17 AND 45
    will turn into 
      condition A: true AND true AND (true OR false)
      condition B: true AND true
    

    然后我只需要创建一个函数,它将用布尔表达式评估字符串为真或假。

    这里is example如何评估逻辑表达式。

    所以我没有用条件测试数组然后检查条件中的项目是否存在于数组中并将它们替换为真/假。有了这个,我得到了一个应该被评估的逻辑表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2019-01-26
      • 2011-09-05
      • 1970-01-01
      相关资源
      最近更新 更多