Совпадение числовых шаблонов для диапазона в SQL - PullRequest
0 голосов
/ 13 марта 2020

Я хочу выбрать столбцы в Oracle: код и номер, основанные на условии,

Если число является любым из следующего, вернуть «E»: ### 7890001 - ### 7890999

где # (первые 3 цифры) может быть любым ди git. Эти числа сохраняются как строковые значения, поэтому мне нужно также привести их к соответствующему типу данных.

Возвращенные данные будут выглядеть следующим образом:

Code         Number
E            2347890001
E            9567890456
E            5647890999

Спасибо, adavnce !!

Ответы [ 3 ]

0 голосов
/ 13 марта 2020

Вы можете использовать to_number с mod и on conversion error (oracle 12,2 или выше) следующим образом:

Select 'E' as code, 
        number
   From your_table
  Where MOD(TO_NUMBER(number DEFAULT -1 ON CONVERSION ERROR), 10000000) 
        between  7890001 and 7890999;

Приветствия !!

0 голосов
/ 13 марта 2020

Предполагая, что описание вашей проблемы правильное, ваши входные данные всегда представляют собой строки 10-ди git, и вы должны возвращать код E тогда и только тогда, когда четыре цифры в середине равны 7890. Правильно? Если это так, самое простое решение - использовать условие LIKE. Обратите внимание, что number является зарезервированным ключевым словом, поэтому его нельзя использовать в качестве имени столбца (надеюсь, имя вашего столбца на самом деле не number, не так ли?)

Строка в LIKE условие трудно читать; он состоит из трех символов подчеркивания, затем 7890, а затем еще трех символов подчеркивания. Подчеркивание обозначает ровно один символ ( любой символ).

with
  simulated_data (num) as (
    select '1234567890' from dual union all
    select '3337890456' from dual union all
    select '7897890455' from dual union all
    select '9998887774' from dual
  )
select num, case when num like '___7890___' then 'E' end as code
from   simulated_data
order  by num
;

NUM        CODE
---------- ----
1234567890  
3337890456 E
7897890455 E
9998887774
0 голосов
/ 13 марта 2020

Это должно работать:

where code = 'E' and
      substr(number, -7) between  '7890001' and '7890999'

РЕДАКТИРОВАТЬ:

select (case when substr(number, -7) between  '7890001' and '7890999' then 'E' end) as code
...