选择列值以字符串开头且以偶数结尾的行

时间:2018-10-04 14:06:23

标签: sql oracle select

这在Oracle数据库中:

我需要从以特定字符串开头并以偶数(然后是奇数)结束的列中返回值。
例如:

ABC001
DEF001
ABD001
ABD002
OPQ001
ABD003
ABD004

我需要一个仅返回ABD002和ABD004的查询。

如果有帮助,字符串的最后3个字符始终为数字。

6 个答案:

答案 0 :(得分:2)

您可以使用substr提取最后三个字符,to_number将其视为数字,然后将mod乘以2以查看是否为偶数:

SELECT *
FROM   mytable 
WHERE  mycolumn LIKE 'ABD%' AND MOD(TO_NUMBER(SUBSTR(mycolumn, -3)), 2) = 0

答案 1 :(得分:1)

轻微变化:

WITH DATA(VAL) AS(
SELECT 'ABC001' FROM DUAL UNION ALL
SELECT 'DEF001' from dual union all
SELECT 'ABD001' FROM DUAL UNION ALL
SELECT 'ABD002' from dual union all
SELECT 'OPQ001' FROM DUAL UNION ALL
SELECT 'ABD003' FROM DUAL UNION ALL
SELECT 'ABD004' from dual 
)
select val  from data
WHERE MOD(TO_NUMBER(SUBSTR(VAL,-3)),2)=0
and SUBSTR(VAL,1,length(VAL)-3) = 'ABD'

答案 2 :(得分:1)

我将使用正则表达式:

select * 
from mytable
where regexp_like(mycolumn, 'ABD..[02468]');

答案 3 :(得分:1)

您可以使用LIKE运算符:

WHERE str LIKE 'ABD%' AND (
    str LIKE '%0' OR
    str LIKE '%2' OR
    str LIKE '%4' OR
    str LIKE '%6' OR
    str LIKE '%8'
)

PS:无论数字位数如何,偶数都以0、2、4、6或8结尾。

答案 4 :(得分:0)

select column from table where substr(column,1,3) = 'ABD' and mod(to_number(substr(column,4,3)),2)=0;

我认为应该这样做。

如果您的表很大,并且需要索引,则可能必须借助基于函数的索引来发挥创意。

也许:

create index column_fbi on table(substr(column,1,3),mod(to_number(substr(column,4,3)),2));

希望有帮助。

答案 5 :(得分:0)

您可以尝试this

with tab(str) as
(
  select 'ABC001' from dual union all
  select 'DEF001' from dual union all
  select 'ABD001' from dual union all
  select 'ABD002' from dual union all
  select 'OPQ001' from dual union all
  select 'ABD003' from dual union all
  select 'ABD004' from dual 
)
select str
  from tab
 where mod(substr(str,length(str),1),2) = 0
   and str like 'ABD%';

P.S。无需进行完全由整数组成的字符串到数字的转换,Oracle隐式地假定为整理的数字,如上述mod操作中一样。

相关问题