Выберите строки, в которых значение столбца начинается со строки И заканчивается четным числом - PullRequest
0 голосов
/ 04 октября 2018

Это в базе данных Oracle:

Мне нужно вернуть значения из столбца, которые начинаются с определенной строки И заканчиваются четным (затем нечетным) числом.
Например:

ABC001
DEF001
ABD001
ABD002
OPQ001
ABD003
ABD004

Мне нужен запрос, который возвращает ТОЛЬКО ABD002 и ABD004.

Последние 3 символа строки всегда числовые, если это помогает.

Ответы [ 6 ]

0 голосов
/ 04 октября 2018

Вы можете попробовать 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%';

PS Нет необходимости выполнять преобразование строки, которая полностью состоит изиз целых чисел, в число, Oracle неявно принимает в качестве числа для сопоставления, как в вышеупомянутой операции mod.

0 голосов
/ 04 октября 2018

Вы можете использовать оператор 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 независимо от количества цифр.

0 голосов
/ 04 октября 2018

Я бы использовал регулярное выражение:

select * 
from mytable
where regexp_like(mycolumn, 'ABD..[02468]');
0 голосов
/ 04 октября 2018

небольшое изменение:

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'
0 голосов
/ 04 октября 2018

Вы можете использовать substr, чтобы извлечь последние три символа, to_number, чтобы обработать их как число, а затем mod на 2, чтобы увидеть, четно ли это:

SELECT *
FROM   mytable 
WHERE  mycolumn LIKE 'ABD%' AND MOD(TO_NUMBER(SUBSTR(mycolumn, -3)), 2) = 0
0 голосов
/ 04 октября 2018
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));

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...