#sql #oracle
#sql #Oracle
Вопрос:
У меня есть основная таблица, в которой есть запись частей с разными типами, но не определенных в одной таблице. Вместо этого у нас есть другая таблица с именем t_pfx, где типы деталей определяются на основе их префиксов при условии, что t_pfx и основная таблица не связаны. допустим, идентификатор детали начинается с E20xxxxxx, E21xxxx ….. до E99xxxxx — это компоненты, определенные в t_pfx.
Я пишу запрос примерно так
select part_id where status in ('OBS','INACT') order by last_mod_date asc;
Но приведенный выше запрос выберет все типы частей.
Мне нужно выполнить запрос со сравнением, если идентификаторы частей начинаются с E20xxxx, E21xxxx ….. Следует извлечь только E99xxxxx. Не могли бы вы, пожалуйста, кто-нибудь помочь мне с этим
Комментарии:
1. Разве это не то, чего вы в принципе хотите —
where part_id between 20000000 and 99999999
?2. ДА. Это именно то, что я ищу. но на самом деле идентификатор части начинается с E20000000 по E9999999
Ответ №1:
Одним из методов являются регулярные выражения:
where status in ('OBS', 'INACT') and
regexp_like(part_id, '^E[2-9][0-9]')
Если вы знаете, что вторая и третья позиции всегда являются цифрами, вы также можете сделать что-то вроде этого:
where status in ('OBS', 'INACT') and
(part_id >= 'E20' AND
part_id < 'E9:'
)
Двоеточие оказывается символом Ascii, следующим сразу за '9'
. Преимущество этого метода в том, что он может использовать индекс, который включает part_id
.
Комментарии:
1. Учитывая оба метода, серии частей, такие как от E20xxxx до E62xxx и от E65XXXX до E78xXXX, являются всего лишь компонентами. итак, я попробовал тот же запрос с небольшой модификацией
where status in ('OBS', 'INACT') and (part_id >= 'E20' AND part_id < 'E62' ) or (part_id >= 'E65' AND part_id < 'E78' )
. но это сработало не так, как ожидалось
Ответ №2:
Используйте like operator
с OR condition
select part_id from tablename
where status in ('OBS','INACT') and (part_id like '20xxxx%' or part_id like '21xxxx%' or
part_id like '99xxxxx%')
order by last_mod_date asc
Комментарии:
1.
select part_id from tablename where status in ('OBS','INACT') and (part_id like '20xxxx%' or part_id like '21xxxx%' or part_id like '99xxxxx%') order by last_mod_date asc
да, это помогает, но мне нужно сравнить идентификатор части, начинающийся с 20xxxx, 21xxx до 99xxxxx. (в порядке нумерации). как я вижу, это станет большим запросом. есть ли что-нибудь, что также может уменьшить размер запроса и сравнение?
Ответ №3:
вы могли бы использовать регулярное выражение в filter
WHERE REGEXP_LIKE(part_id,'[^0-9]');
Ответ №4:
… где substr(part_id,1,2) >= 20