Oracle SQL. Как сделать случай, когда оператор THEN выводит букву, за которой следуют 4 цифры - PullRequest
0 голосов
/ 29 апреля 2020

Итак, я хочу создать оператор case, который выводит что-то вроде case, когда «имя поля» не равно NULL, а затем «»

Я хочу, чтобы вывод был похож на «R0001», «R0002», «R1234» и т. Д. c. Таким образом, он начинается с R максимум до четырех цифр.

Я пытался использовать regexp_like [a-zA-Z]{1}\d{4}, но не могу заставить его работать.

select distinct field_name
     , CASE WHEN field_name is not null
            THEN regexp_like [a-zA-Z]{1}\d{4}        
            ELSE null
       End as field_name1    
  from table;;

1 Ответ

2 голосов
/ 29 апреля 2020

Есть несколько синтаксических ошибок. В частности, использование regexp_like некорректно.

  select
distinct field_name
       , CASE
            WHEN field_name is not null AND regexp_like(field_name, '[a-zA-Z]{1}\d{4}')
            THEN '<whatever>'        
            ELSE null
         END as field_name1    
    from "table"
       ;

Кстати, регулярное выражение не соответствует описанию, поскольку оно соответствует в точности 4 цифры (вместо до 4 ). Последнее будет обработано [a-zA-Z]\d{1,4}.

Обновление

Чтобы отобразить field_name значений в набор имен, подчиняющихся шаблону R\d{4} с последовательной нумерацией, начинающейся с 1, используйте один из следующих запросов:

Вариант 1: field_name является AK для table

select field_name
     , 'R' || to_char(rownum, 'FM0009') anon_field_name
  from "table"
     ; 

Вариант 2: table может содержат дубликаты field_name

select field_name
     , 'R' || to_char(rownum, 'FM0009') anon_field_name
  from (
           select
         distinct field_name 
             from "table"
       ) t_names
     ; 

Запросы задаются от c до oracle, но практически каждый rdbms имеет функцию / псевдостолбец, эквивалентный ROWNUM, и предлагает функции форматирования строки для начальных нулей пэдов .

Рандомизированное отображение

Отображение между field_names и числами в именах анонимных полей отражает порядок, в котором записи из table встречаются в наборе результатов. Этот порядок не гарантируется, если вы не укажете предложение order by. Технически, вывод не предсказуем.

Однако, если у вас сложилось впечатление, что порядок записи не изменяется (в достаточной степени) по запросам, добавьте (псевдо) случайные числа в набор результатов и упорядочите его соответствующим образом:

  select field_name
       , 'R' || to_char(rownum, 'FM0009') anon_field_name
    from (
              select field_name
                   , dbms_random.value  code
                from (
                         select
                       distinct field_name
                           from "table"
                     ) t_names
         ) t_withrandom
order by t_withrandom.code
     ; 

Опять же, метод генерации (псевдо) случайных чисел указывается от c до Oracle, но продукты всех других поставщиков имеют эквивалентные функции.

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