2016-01-03 3 views
2

У меня есть целочисленный массив, для которого я должен проверить, соответствуют ли элементы логическому условию. Например:Поиск массива с логическим условием

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

Как проверить, что элементы массива выполнить условие. У меня есть элементы массива хранятся в БД в виде строк с общим идентификатором:

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

Если кто-то имеет какие-либо идеи, как проверить, что эти значения отвечают условию через SQL или поиск по массиву, я был бы признателен.

+0

Какова структура таблицы. Без структуры базы данных нельзя ответить на это. –

+0

Вы спрашиваете, как написать условие WHERE для запроса SELECT? – Steve

+0

Это таблица пунктов счета-фактуры. Каждая строка представляет элемент с его идентификатором (целочисленное значение), и я должен проверить, имеет ли счет (ID_1) элементы, соответствующие логическому условию. В таблице есть несколько столбцов (цена, сумма, ...), но идентификатор счета и идентификатор товара являются полем для проверки того, что элементы ivoice соответствуют условиям. – Zivko

ответ

0

Я предполагаю, что вы хотите найти счета-фактуры, содержащие элемент 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_id s является уникальным для каждого счета.

+0

Состояние может быть любым, как 2 ИЛИ (5 И 7 И 15), поэтому мне нужен универсальный подход. Я старался преобразовывать строки в массив, а затем накладывать на него логическое условие. – Zivko

+0

Перевести на слова: если у меня есть яблоко и бананы в счете-фактуре, тогда мне нужно добавить конкретный текст внизу. Это может быть что угодно, если у меня есть (лук или чеснок) и яйцо, тогда я напишу на дне «красивые яичницы» – Zivko

+0

Если вы прочитаете данные в массиве, это не будет вопросом SQL вообще. Но где ваша проблема? Не можете ли вы сделать что-то вроде 'array.Contains (1) AndAlso array.Contains (17) AndAlso (array.Contains (22) OrElse array.Contains (49))'? –

0

Я нашел решение в обратной логике. Для каждого элемента в условии, представляющем элемент (не скобки или логический операнд, поэтому целочисленный), я проверил, является ли он элементом массива. Если это тогда, то оно заменяется на 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 как оценить логическое выражение.

Так что я не тестировал массив с условием, а затем проверял, существуют ли элементы в условии или нет в массиве и заменяют их на true/false. С этим я получил логическое выражение, которое должно быть оценено.

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 

EDIT

Он не будет делать, как только сейчас прочитал, что условие было бы ничего. Поэтому я бы использовал expression trees.

Смежные вопросы