Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何使用ROW_NUMBER()-但不是增量数字,而是生成A、B、C、D、E_Postgresql - Fatal编程技术网

Postgresql 如何使用ROW_NUMBER()-但不是增量数字,而是生成A、B、C、D、E

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()生成递增的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,你需要稍微调整一下)。

您需要编写自己的函数,如()所示:


它将数字基数从基数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;
$$;