SQL中的整数值右填充

SQL中的整数值右填充,sql,postgresql,Sql,Postgresql,步骤1:我有一个名为XYZ的表,其中包含以下整数列: ID A B C 1 201507 20150810 20150311 2 20150812 201509 201510 我需要编写一个SQL查询,如果A、B和C的任何值小于8个数字,那么我需要把它作为8个数字,在STEP2的值右边加上零点,我不允许更新表。例如: ID A B C 1 201507

步骤1:我有一个名为XYZ的表,其中包含以下整数列:

 ID      A          B          C
 1    201507    20150810   20150311
 2    20150812  201509     201510

我需要编写一个SQL查询,如果A、B和C的任何值小于8个数字,那么我需要把它作为8个数字,在STEP2的值右边加上零点,我不允许更新表。例如:

 ID      A            B          C
 1    20150700    20150810   20150311
 2    20150812    20150900   20151000
如何通过SQL查询将零添加到整数值的右侧

步骤2:我需要为每个记录找到一个只要试试这个

select
ID,
A = LEFT(cast(a as varchar(100)+'00000000',8),
b = LEFT(cast(b as varchar(100)+'00000000',8),
C = LEFT(cast(c as varchar(100)+'00000000',8)
from xyz
试试这个

select
ID,
A = LEFT(cast(a as varchar(100)+'00000000',8),
b = LEFT(cast(b as varchar(100)+'00000000',8),
C = LEFT(cast(c as varchar(100)+'00000000',8)
from xyz
试试这个:

select cast(left(cast(A as varchar(20)) + '00000000', 8) as int) as [A],
       cast(left(cast(B as varchar(20)) + '00000000', 8) as int) as [B],
       cast(left(cast(C as varchar(20)) + '00000000', 8) as int) as [C]
from TABLE_NAME
如果要避免任何强制转换,这可能是一种解决方案:

select case when 8 - LEN(A) > 0 then A * Power(10, (8 - LEN(A))) else A end as [A],
       case when 8 - LEN(B) > 0 then B * Power(10, (8 - LEN(B))) else B end as [B],
       case when 8 - LEN(C) > 0 then C * Power(10, (8 - LEN(C))) else C end as [C]
from MY_TABLE
试试这个:

select cast(left(cast(A as varchar(20)) + '00000000', 8) as int) as [A],
       cast(left(cast(B as varchar(20)) + '00000000', 8) as int) as [B],
       cast(left(cast(C as varchar(20)) + '00000000', 8) as int) as [C]
from TABLE_NAME
如果要避免任何强制转换,这可能是一种解决方案:

select case when 8 - LEN(A) > 0 then A * Power(10, (8 - LEN(A))) else A end as [A],
       case when 8 - LEN(B) > 0 then B * Power(10, (8 - LEN(B))) else B end as [B],
       case when 8 - LEN(C) > 0 then C * Power(10, (8 - LEN(C))) else C end as [C]
from MY_TABLE
可以使用rpad添加尾随零,然后将结果转换回整数:

select id, 
       rpad(a::text, 8, '0')::int, 
       rpad(b::text, 8, '0')::int, 
       rpad(c::text, 8, '0')::int
from the_table;
要避免重复表达式,请使用派生表:

select *
from (
  select id, 
         rpad(a::text, 8, '0')::int as a, 
         rpad(b::text, 8, '0')::int as b, 
         rpad(c::text, 8, '0')::int as c
  from the_table
) t
where a < b or b < c --<< change that to the condition you want
可以使用rpad添加尾随零,然后将结果转换回整数:

select id, 
       rpad(a::text, 8, '0')::int, 
       rpad(b::text, 8, '0')::int, 
       rpad(c::text, 8, '0')::int
from the_table;
要避免重复表达式,请使用派生表:

select *
from (
  select id, 
         rpad(a::text, 8, '0')::int as a, 
         rpad(b::text, 8, '0')::int as b, 
         rpad(c::text, 8, '0')::int as c
  from the_table
) t
where a < b or b < c --<< change that to the condition you want

你可以使用触发器吗?如果是,插入前触发器可用于检查插入值并乘以10,直到达到8位。步骤2的预期结果是什么?是否允许使用触发器?如果是,插入前触发器可用于检查插入值并乘以10,直到达到8位。步骤2的预期结果是什么?谢谢。我不允许将类型更改为VARCHAR。值应该是整数。您好,我根据您的喜好更新了解决方案,而没有将列转换为varcharThanks。我不允许将类型更改为VARCHAR。值应该是整数。您好,我更新了解决方案,但没有转换列,因为varcharIf列是整数,零将隐式转换为兼容的int类型,因此它将转换为零,所以a+'00000000'=a@MichałTurczyn我添加了一个cast语句如果列是整数,零将隐式转换为兼容类型int,因此它将转换为零,因此a+'00000000'=a@MichałTurczyn我添加了一个演员声明