#sql #db2
Вопрос:
У меня есть таблица с именем TableA, в которой есть два столбца дат. В настоящее время я использую приведенный ниже запрос для извлечения данных.
«выберите * из таблицы, где IN_Date между датами 1 и 2»
IN_DATE — это входной параметр из процесса
Теперь вместо одной даты IN_DATE я хочу передать список дат, но я не уверен, как обновить запрос. Пожалуйста, помогите.
Таблица
идентификатор дата 1 дата 2
Комментарии:
1. Вы хотите передать эти даты в виде строки значений, разделенных запятыми (или какими-либо другими), например
2021-01-15, 2021-01-20, ...
? Или как-то еще?
Ответ №1:
Прежде всего, я хочу прояснить это.. каков тип данных столбцов даты и какой формат вы используете для хранения? В каком формате вы передаете IN_DATE ?
Комментарии:
1. IN_Date на данный момент является датой, но будет передан в виде строки дат, разделенной запятыми. Столбцы date1 и date2 будут иметь тип ДАТА
Ответ №2:
Решение вашей проблемы
выберите * из таблицы, где ( (Дата между датами 1 и 2) или (дата между датами 3 и 4) или (дата между датами 5 и 6) )
Комментарии:
1. столбцы являются фиксированными, дата1 и дата2. Вместо этого IN_DATE представляет собой список дат, передаваемых в виде строки, разделенной запятыми.
2. дата 1, дата 2, дата 3, дата 4, дата 5 и дата 6-это список значений даты, а не столбцов. если проблема не решена, пожалуйста, поделитесь примером ожидаемого результата
Ответ №3:
То, что вы пытаетесь сделать, просто невозможно.
Синтаксис предложения between таков:
… выражение 1 МЕЖДУ выражением2 И выражением3 …
Каждое выражение должно разрешаться одним значением (а не списком значений). Кроме того, выражение2 будет Где expressionN-это имя столбца, то единственное значение-это значение в строке, которая в данный момент оценивается.
Это говорит о том, что вы, возможно, подходите к этому неправильно. Пожалуйста, предоставьте некоторые примеры данных и ожидаемые результаты. Это позволит лучше понять, что вы пытаетесь сделать. Также было бы полезно описание того, чего вы хотите достичь, а не описание того, как вы пытаетесь этого достичь.
Ответ №4:
Вы можете использовать подход токенизации строк, как показано ниже, где параметр IN_DATE
string содержит список дат, разделенных запятыми, в виде YYYY-MM-DD
.
select * from tableA t where exists ( select 1 from xmltable ( 'for $id in tokenize($s, ",") return lt;igt;{normalize-space ($id)}lt;/igt;' passing IN_DATE as "s" columns tok char(10) path '.' ) v where date (to_date (v.tok, 'YYYY-MM-DD')) between t.date1 and t.date2 )