Postgresql 如何使用ROW_NUMBER()-但不是增量数字,而是生成A、B、C、D、E
我使用ROW_NUMBER()生成递增的ID号,如下所示Postgresql 如何使用ROW_NUMBER()-但不是增量数字,而是生成A、B、C、D、E,postgresql,Postgresql,我使用ROW_NUMBER()生成递增的ID号,如下所示 ROW_NUMBER () OVER (ORDER BY ProductDate) as ID i、 e 一, 2. 3. 四, 我怎样才能做同样的事情,但创建像这样按字母顺序排列的字母 A. B C D E F ..... AA,BB,CC 有什么想法吗?提前Thx 您需要编写自己的函数,如()所示: 它将数字基数从基数10转换为基数26,并将数字0-25替换为A到Z。它不是很完美,只是一个快速的草图(例如,A现在是0,你需要稍微调
ROW_NUMBER () OVER (ORDER BY ProductDate) as ID
i、 e
一,
2.
3.
四,
我怎样才能做同样的事情,但创建像这样按字母顺序排列的字母
A.
B
C
D
E
F
..... AA,BB,CC
有什么想法吗?提前Thx
您需要编写自己的函数,如()所示:
它将数字基数从基数10转换为基数26,并将数字0-25替换为A到Z。它不是很完美,只是一个快速的草图(例如,A现在是0,你需要稍微调整一下)。
您需要编写自己的函数,如()所示:
它将数字基数从基数10转换为基数26,并将数字0-25替换为A到Z。它不是很完美,但只是一个快速的草图(例如,此时A为0,您需要对其进行一点调整)。您可以将函数Chr()和Ascii()一起使用来增加一个字符。唯一的另一个复杂问题是确定下一个值何时为“…AA”,而不是增加最后一个字母(即“AY”=>“AZ”而“AZ”=>“AAA”)。因此,请尝试: 测试:
可以同时使用函数Chr()和Ascii()来递增字符。唯一的另一个复杂问题是确定下一个值何时为“…AA”,而不是增加最后一个字母(即“AY”=>“AZ”而“AZ”=>“AAA”)。因此,请尝试: 测试:
这回答了你的问题吗?另请参见thx,是和否。。我如何创建函数来实现这一点,代码是什么?我需要从现有查询中调用函数。这是否回答了您的问题?另请参见thx,是和否。。我如何创建函数来实现这一点,代码是什么?我需要从现有查询中调用该函数。
CREATE OR REPLACE FUNCTION number_to_base(num BIGINT, base INTEGER)
RETURNS TEXT
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
WITH RECURSIVE n(i, n, r) AS (
SELECT -1, num - 1, 0
UNION ALL
SELECT i + 1, n / base, (n % base)::INT
FROM n
WHERE n > 0
)
SELECT string_agg(ch, '')
FROM (
SELECT chr(ascii('A') + r) ch
FROM n
WHERE i >= 0
ORDER BY i DESC
) ch
$function$;
create or replace function alpha_sequence_next_val( alpha_seq_in text)
returns text
language sql
immutable
as $$
select case when alpha_seq_in is null
or alpha_seq_in = ''
then 'A'
when substr(alpha_seq_in, length(alpha_seq_in), 1) = 'Z'
then concat(substr(alpha_seq_in,1,length(alpha_seq_in)-1 ), 'AA')
else (substr(alpha_seq_in, 1,length(alpha_seq_in)-1)) ||
chr(ascii(substr(alpha_seq_in, length(alpha_seq_in)))+1)
end;
$$;
do $$
declare
seq_value text;
begin
for test_seq in 0 .. 26*3
loop
seq_value = alpha_sequence_next_val(seq_value);
raise notice 'Next Sequence==> %', seq_value;
end loop;
end;
$$;