SQL テーブルの整数フィールドのすべての桁を分割したいと考えています。その例は次のようになります: FinancialNb = 7869 1 桁目に 7、2 桁目に 8、3 桁目に 6、4 桁目に 9 が必要です。これは、すべての桁を Crystal レポートの 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
おそらくあなたの質問は parse に関するものです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 に答える