带有subString的sql

时间:2017-02-03 18:30:40

标签: sql oracle

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

4 个答案:

答案 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

  • 不以bm结尾
  • 有一行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'));

答案 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)

我为您创建了样本数据库,其中包含您提供的相同数据记录。

表: enter image description here

希望此查询可以帮助您,根据您的要求修改“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'结尾

注意:我修改了表名和列名

enter image description here