2017-02-03 2 views
1

У меня есть 2 поля в БД следующим образом:SQL с подстрокой

table: t_doc_met 
t_doc t_num 
PI 200923712291920BM 
OI 200923712291920BM 
OD 200923712301921OP 
PD 200923712301921MO 
MR 200923712301921F 
BR 200923712305622BM 
MR 200923712305622F 
OB 200923712305622M1 
OR 200923712305622D 
MR 200923712314324M1 
MR 200923712314324MO 
BR 200923712314324BM 
PI 200923712314325OP 
OI 20092371231433MO 

Я хочу, чтобы выбрать все записи в этой таблице, чьи t_doc в («PD», «OB», «OD», 'ИЛИ ','МИСТЕР'). также выбрать t_doc IN ('BR', 'PI', 'OI'), чьи t_num заканчивается 'BM'

select * from t_doc_met where 
t_doc IN ('PD','OB','OD','OR','MR') AND 
(t_doc IN ('BR','PI','OI') AND SUBSTR(t_num, LENGTH(t_num) - 1, 2) IN ('BM')) 
+0

Какие проблемы являются вы это делаете? Вы просто хотите «ИЛИ» вместо первого «И»? –

+0

обе. Его часть большого sql и это ломается из-за этого добавления. Поэтому пытаюсь понять. – JNPW

+1

У вас не может быть И там, вы пытаетесь сделать одно значение ниже для обоих списков «IN» одновременно, что невозможно ... –

ответ

2

У вас есть AND вместо OR:

SELECT * 
FROM t_doc_met 
WHERE 
    (t_doc IN ('PD','OB','OD','OR','MR')) 
    OR 
    (t_doc IN ('BR','PI','OI') AND SUBSTR(t_num, -2) IN ('BM')) 

Обратите внимание, что Oracle SUBSTR принимает отрицательные индексы, чтобы означать «начало со спины». Поэтому я переписал ваш

SUBSTR(t_num, LENGTH(t_num) - 1, 2) IN ('BM') 

в

SUBSTR(t_num, -2) IN ('BM') 
1

Я буду интерпретировать этот вопрос, как говорят: Вы хотите, чтобы все t_docs

  • , которые не заканчиваются на Ьт
  • , которые имеют строка с t_doc IN ('PD', 'OB', 'OD', 'OR', 'MR')
  • , которые имеют строку с t_doc IN ('BR', ' PI ' 'OI')

Если это правильно:

select dm.t_num 
from t_doc_met dm 
where t_num LIKE '%BM' 
group by t_num 
having sum(case when t_doc IN ('PD', 'OB', 'OD', 'OR', 'MR') then 1 else 0 end) > 0 and 
     sum(case when t_doc IN ('BR','PI','OI') then 1 else 0 end) > 0; 

В качестве альтернативы, вы можете просто хотите or:

select dm.t_num 
from t_doc_met dm 
where (t_doc IN ('PD', 'OB', 'OD', 'OR', 'MR')) or 
     (t_num LIKE '%BM' and ('BR', 'PI', 'OI')); 
1

Вы ищете строк, где t_doc в' PD», 'ОВ', 'ОД', 'ИЛИ', 'МР'; и в то же время находится в 'BR', 'PI', 'OI'. Это взаимоисключающие.

Вы, кажется, просто хочу, чтобы первый AND быть OR:

select * from t_doc_met where 
t_doc IN ('PD','OB','OD','OR','MR') OR 
(t_doc IN ('BR','PI','OI') AND SUBSTR(t_num, -2) IN ('BM')); 

T_ T_NUM    
-- ----------------- 
PI 200923712291920BM 
OI 200923712291920BM 
OD 200923712301921OP 
PD 200923712301921MO 
MR 200923712301921F 
BR 200923712305622BM 
MR 200923712305622F 
OB 200923712305622M1 
OR 200923712305622D 
MR 200923712314324M1 
MR 200923712314324MO 
BR 200923712314324BM 

12 rows selected. 

Я также упрощен второй аргумент вашего SubStr, поскольку dasblinkenlight упоминалось вы могли бы сделать.

Если это часть большого запроса, то вам необходимо убедиться, что условия, указанные в скобках соответственно, таким образом, анализатор может интерпретировать общую логику вы собираетесь:

select * from t_doc_met where 
-- some other conditions 
AND (t_doc IN ('PD','OB','OD','OR','MR') OR 
    (t_doc IN ('BR','PI','OI') AND SUBSTR(t_num, -2) IN ('BM'))); 
1

Я создал образец базу данных для вас с теми же данными, которые вы предоставили.

Таблица: enter image description here

Надежда этот запрос помогает, изменить «И/ИЛИ» на основе ваших требований.

SELECT * FROM categories WHERE categoryName in ('PD','OB','OD','OR','MR') OR (categoryName in ('BR','PI','OI') and description like '%BM') 

Я использовал или условие, чтобы получить как запись набора t_doc в ('PD', 'OB', 'OD', 'ИЛИ', 'MR').Также выбрать t_doc IN ('BR', 'PI', 'OI'), чьи t_num заканчивается 'БМ'

Примечание: Я изменил таблицу Имя и имена столбцов

enter image description here

Смежные вопросы