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



这是在Oracle DB中:

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

ABC001
DEF001
ABD001
ABD002
OPQ001
ABD003
ABD004

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

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

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

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

我会使用正则表达式:

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

略有变化:

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'

您可以使用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 结尾,无论位数如何。

你可以试试这个

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%';

附言没有必要将完全由整数组成的字符串转换为数字,Oracle 隐式假设为排序规则的数字,如上述mod操作所示。

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

最新更新