Я знаю, это боль, но я не могу рекомендовать вас достаточно, чтобы делать ваши исследования регулярными выражениями. Я являюсь человеком вроде C #, JS, поэтому это не проверено в VBA, но должно быть довольно хорошей отправной точкой:
Что вы хотите:
\d+(?!\()
не пропустите раздел «edit»
Объяснение:
\d+
Это просто соответствует номерам. Вы можете сопоставить диапазон (со ссылкой на таблицу asci) символов в [], вы можете использовать [1-9], но есть ярлык для цифры «\ d». Вы хотите, чтобы все числа в строке отображались по крайней мере один раз , Вы можете сделать это, используя {minimum, maximum}, который был бы {1,}, но также есть ярлык для этого символа "+", означающий, по крайней мере, один раз.
(?<!\()
Отрицательный Lookbehind - говорит, что вы хотите совпадение без этого префикса, а не в том числе - вот что выглядит вокруг. Этот ищет файл (, который вам нужно сбежать) \ ("
(?<= )
Положительный Lookbehind - делает ли что-то противоположное, ищет совпадения с префиксом префикса, не включенным в совпадение. Это ищут пустое пространство.
(?= )
Positive Lookahead - Единственное отличие состоит в том, что это выглядит в обратном направлении, а это означает, что он ищет постышки, не входящие в совпадение. снова ищет пустое пространство.
(?! )
Отрицательный Lookahead - я думаю, что вы получите его в этот момент, он делает то же самое, что и предыдущее, но отрицает. Конечно, не включен в окончательное соответствие.
Наконец, вы можете использовать
\d+(?= )(?!\()
так же, как показано в примере, который вы предоставили, но это зависит от формата строки.
EDIT: мне было сообщено QHarr, что VBA очень неудобен в lookbehinds, но поддерживает lookahead. Я меняю свое решение из
(?<!\()(?<= )\d+(?= )(?!\()
TO
\d+(?= )(?!\()
EDIT2:
Я изменил решение снова из
\d+(?= )(?!\()
TO
\d+(?!\()
Поскольку, как предположил Рон Розенфельд, это решение не будет достаточно общим для «соответствия первому купе, который не находится в круглых скобках». проблема в том, что он не будет соответствовать числу в конце строки, из-за положительного взгляда на поиск пространства.
Вы хотите вернуть все допустимые строки из таблицы, верно?
Таким образом, вы должны объединить результаты после получения doc_owner_id
с, которые удовлетворяют условиям таблицы:
select t.*
from tablename t inner join (
select doc_owner_id
from tablename
where
str_to_date('4/9/2018', '%m/%d/%Y') between doc_start_date and doc_end_date
and
doc_type in ('JANUARY', 'DRIVER', 'LICENCE')
group by doc_owner_id
having count(distinct doc_type) = 3
) g on g.doc_owner_id = t.doc_owner_id
where
str_to_date('4/9/2018', '%m/%d/%Y') between t.doc_start_date and t.doc_end_date
and
t.doc_type in ('JANUARY', 'DRIVER', 'LICENCE')
Вы можете использовать агрегирование:
SELECT DOC_OwnerID
FROM mytable
WHERE @mydate >= DOC_start_date AND @mydate <= DOC_end_date
GROUP BY DOC_OwnerID
HAVING
MAX(DOC_type = 'JANUARY') = 1
AND MAX(DOC_type = 'DRIVER') = 1
AND MAX(DOC_type = 'LICENSE') = 1
Это вернет DOC_OwnerID
с, что для данного параметра @mydate
имеют все три DOC_type
значения.