2017-02-03 3 views
1

Ich habe 2 Felder in DB wie folgt:sql mit Teilzeichen

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 

I alle Datensätze in dieser Tabelle, deren t_doc abholen möchte, ist in ('PD', 'OB', 'OD', "OR ','HERR'). Auch

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

Welches Problem ist Hast du das gemacht? Willst du einfach ein 'OR' anstelle des ersten' AND'? –

+0

beide. Sein Teil eines größeren sql und das ist wegen dieser Zugabe zu brechen. Also versuchen zu verstehen. – JNPW

+1

Sie können kein UND haben, Sie versuchen, unten einen einzigen Wert für beide "IN" -Listen gleichzeitig zu machen, was nicht möglich ist ... –

Antwort

2

Sie haben anstelle von OR ein AND t_doc IN ('BR', 'PI', 'OI'), dessen t_num endet mit 'BM' Pick:

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')) 

Man beachte, dass Oracle SUBSTR nimmt negative Indizes zu "Start von hinten". Daher schrieb ich Ihre

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

als

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

ich die Frage interpretieren werde mit den Worten: Sie wollen alle t_docs

  • , die in bm
  • nicht zu Ende, die haben eine Zeile mit t_doc IN ('PD', 'OB', 'OD', 'ODER', 'MR')
  • mit einer Zeile mit t_doc IN ('BR', ' PI ' 'OI')

Wenn dies korrekt ist:

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; 

Alternativ können Sie nur wollen 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

Sie suchen Zeilen, in denen t_doc in ist' PD, OB, OD, OR, MR; und zur gleichen Zeit ist in 'BR', 'PI', 'OI'. Diese schließen sich gegenseitig aus.

Sie scheinen zu wollen, nur der erste AND ein OR sein:

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. 

ich auch Ihre substr Das zweite Argument vereinfacht haben, wie dasblinkenlight erwähnt man tun könnte.

Ist dies Teil einer größeren Abfrage dann müssen Sie sicherstellen, dass die Bedingungen in den Klammern in geeigneter Weise eingeschlossen sind, so dass der Parser die allgemeine Logik interpretieren können Sie beabsichtigen:

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

ich die Probe angelegt haben Datenbank für Sie mit den gleichen Datensätzen, die Sie bereitgestellt haben.

Tabelle: enter image description here

Hoffnung diese Abfrage Sie hilft, ändern die „UND/ODER“, basierend auf Ihren Anforderungen.

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

ich verwendet habe ODER-Bedingung sowohl den Datensatz von t_doc zu erhalten, ist in ('PD', 'OB', 'OD', 'OR', 'MR').Pick t_doc auch IN ('BR', 'PI', 'OI'), dessen t_num endet mit

Note 'BM': Ich habe den Tabellennamen und Spaltennamen geändert

enter image description here

Verwandte Themen