我在DB中有两个字段如下:
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','OR','MR')。 同时选择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 :(得分: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 :(得分:1)
我将解释这个问题:你想要所有的t_docs
如果这是正确的:
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'));
答案 2 :(得分:1)
您正在寻找t_doc
位于' PD'' OB'' OD'' OR&#39的行;,' MR&#39 ;;和同时在',' 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.
我还简化了你的第二个参数,正如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')));
答案 3 :(得分:1)
我为您创建了样本数据库,其中包含您提供的相同数据记录。
希望此查询可以帮助您,根据您的要求修改“AND / OR”。
SELECT * FROM categories WHERE categoryName in ('PD','OB','OD','OR','MR') OR (categoryName in ('BR','PI','OI') and description like '%BM' )
我使用OR条件来获取t_doc的记录集('PD','OB','OD','OR','MR')。同时选择t_doc IN('BR','PI','OI'),其t_num以'BM'结尾
注意:我修改了表名和列名