Я хочу сравнить запись с подстрокой записи из другой таблицы в SQL

#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