Oracle SQL - выберите максимальное целочисленное значение из строки UserID - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу выбрать MAX значение целого числа, связанного с UserID в моей таблице базы данных Oracle, чтобы сгенерировать следующее имя пользователя для пользователей с похожим UserID.

UserID содержит значения, указанные ниже.Не существует фиксированного шаблона символов перед целым числом, так как строка является именем пользователя.

TKe10
TKe9
TKe12
TomKelly13
TomKelly9
PJames12
PJames7

Я пытался использовать приведенный ниже запрос, но он всегда дает TKe9 ИЛИ TomKelly9 ИЛИ PJames7 в качестве MAX значение.

SELECT * FROM 
              (SELECT MAX(UserID) from PV_USERS
              WHERE REGEXP_LIKE (UserID, '^'|| '<some_user_id>'|| '[^A- 
              Za-z][0-9]*'));

Я также пытался использовать ORDER BY DESC WHERE ROWNUM<=1, но он также дает тот же вывод.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018
with temp as
(
select 'Tke10' userid from dual
union all
 select 'Tke9' userid from dual
union all
 select 'Tke12' userid from dual
union all
 select 'Tomkelly13' userid from dual
union all
 select 'Tomkelly9' userid from dual
union all
 select 'Pjames12' userid from dual
union all
 select 'Pjames7' userid from dual
 )

    select A||B from (
 select 
 substr(userid,1,instr(userid,to_number(regexp_substr(userid,'\d+$')))-1) A
,max(to_number(regexp_substr(userid,'\d+$'))) B
from temp
 group by substr(userid,1,instr(userid,to_number(regexp_substr(userid,'\d+$')))-1)
)
 ;
0 голосов
/ 20 ноября 2018

Вам нужно извлечь только числовую часть идентификатора, которую вы можете сделать с помощью

regexp_substr(userid, '[0-9]*$')

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

max(to_number(regexp_substr(userid, '[0-9]*$')))

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

select coalesce(max(to_number(regexp_substr(userid, '[0-9]*$'))), 0) as max_num
from pv_users
where regexp_like(userid, '^'|| 'TomKelly'|| '[0-9]*');

   MAX_NUM
----------
        13

select coalesce(max(to_number(regexp_substr(userid, '[0-9]*$'))), 0) as max_num
from pv_users
where regexp_like(userid, '^'|| 'PJames'|| '[0-9]*');

   MAX_NUM
----------
        12

select coalesce(max(to_number(regexp_substr(userid, '[0-9]*$'))), 0) as max_num
from pv_users
where regexp_like(userid, '^'|| 'NewName'|| '[0-9]*');

   MAX_NUM
----------
         0

... а затем добавьте 1 и добавьте обратно в корень, чтобы получить следующий идентификатор.

В зависимости от ваших бизнес-правил, вы можете захотетьчтобы сделать фильтр нечувствительным к регистру.


Вы должны знать, что два сеанса, выполняющие эту операцию одновременно, будут видеть один и тот же результат, поэтому оба будут пытаться создать один и тот же идентификатор, например TomKelly14.Вам нужно либо сериализовать эту операцию генерации, либо включить откат, например, проверку на наличие нарушения PK при попытке вставить новое значение в таблицу и повторение, если это произойдет.

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