Как прочитать несколько строк и дат в таблице MySQL в одном операторе чтения?

Я знаю, это боль, но я не могу рекомендовать вас достаточно, чтобы делать ваши исследования регулярными выражениями. Я являюсь человеком вроде 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+(?!\()

Поскольку, как предположил Рон Розенфельд, это решение не будет достаточно общим для «соответствия первому купе, который не находится в круглых скобках». проблема в том, что он не будет соответствовать числу в конце строки, из-за положительного взгляда на поиск пространства.

-1
задан PCG 6 April 2019 в 20:20
поделиться

2 ответа

Вы хотите вернуть все допустимые строки из таблицы, верно?
Таким образом, вы должны объединить результаты после получения 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')
0
ответ дан forpas 6 April 2019 в 20:20
поделиться

Вы можете использовать агрегирование:

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 значения.

0
ответ дан GMB 6 April 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: