我想拆分 sql 表中整数字段中的每个数字。例如:financialNb = 7869 我需要 7 作为第一位,8 作为第二位,6 作为第三位,9 作为第四位。这是必需的,因为我希望每个数字都用作水晶报表中的 1 个数据字段?
问问题
440 次
3 回答
1
首先,您必须先将数字转换或转换为文本,然后才能以这种方式操作它们。您正在寻找的功能是CAST()和SUBSTRING()。要让数字从右边开始,您可以使用REVERSE()。
试试这个例子:
SELECT 7869 AS field1
INTO #tmp
SELECT SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),8,1) AS [Column8]
,SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),7,1) AS [Column7]
,SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),6,1) AS [Column6]
,SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),5,1) AS [Column5]
,SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),4,1) AS [Column4]
,SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),3,1) AS [Column3]
,SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),2,1) AS [Column2]
,SUBSTRING(REVERSE(CAST(field1 AS VARCHAR(255))),1,1) AS [Column1]
FROM #tmp
DROP TABLE #tmp
于 2013-01-14T13:30:45.800 回答
0
大概你的问题是关于 parsing 7869
。为此使用该substring
功能:
select substring(cast(<col> as char(4)), 1, 1) as FirstChar,
substring(cast(<col> as char(4)), 2, 1) as SecondChar,
substring(cast(<col> as char(4)), 3, 1) as ThirdChar,
substring(cast(<col> as char(4)), 4, 1) as FourthChar
from YourTable
我可能错误地解释了数字的顺序,这假设字符串始终是 4 位数字并且您需要字符。另一种方法是将其视为数字:
select <col%10 as FirstNum,
(col/10) %10 as SecondNum,
(col/100)%10 as ThirdNum,
(col/1000)%10 as FourthNum
于 2013-01-14T14:23:53.530 回答
0
您可以使用模运算符 ( %
) 来获取整数的数字,而无需使用较慢的字符串操作函数,如下所示
select
value % 100000000 / 10000000,
value % 10000000 / 1000000,
value % 1000000 / 100000,
value % 100000 / 10000,
value % 10000 / 1000,
value % 1000 / 100,
value % 100 / 10,
value % 10
from testData
这是一个可以使用的SQL Fiddle。如果该字段始终是 4 个数字长,您可以逃脱:
select
value / 1000 as Thousands,
value % 1000 / 100 as Hundreds,
value % 100 / 10 as Tens,
value % 10 as Units
from testData
但是,如果您需要在任意数字上使用它,您可以创建一个用户定义的表值函数,它将返回表中的数字,如下所示:
create function dbo.getDigits(@Input int)
returns @Digits table
(
Digit int,
Position int
)
as begin
declare @pos int
declare @digit int
set @pos = 0
if @input = 0
begin
-- zero is just a single zero digit at position 1
insert into @digits values (0,1)
return
end
while @input<>0 begin
set @pos=@pos+1
set @digit = @input % 10
set @input = @input / 10
insert into @digits values (@digit, @pos)
end
return
end
并像这样使用它:
SELECT td.ID, td.Value, d.Digit, d.Position
FROM testData td
CROSS APPLY dbo.getDigits(td.Value) AS d
order by td.ID, d.Position Desc
(这是另一个SQL Fiddle,基于前一个)
于 2013-01-14T14:33:44.370 回答