我将字符数据存储在从数据文件导入的列中。字符数据表示一个整数值,但是..最后(最右边的)字符并不总是一个数字字符。我试图使用SQL表达式将字符数据转换为整数值,但它不起作用。SQL逻辑不起作用
我在下面显示了一条SQL语句的尝试,以及一个演示它不工作的测试用例。我的做法是从字符串中分离最右边的字符,进行适当的转换,然后将它们串起来并转换为整数。
问:如何修复我的SQL表达式以正确地转换它,或者可以使用什么SQL表达式来执行转换?
详情
字符串中的最右边的字符可以是在下面的“代码”列中的值中的一个。 “Digit”列显示由字符表示的实际整数值,“Sign”列显示整个字符串是否被解释为负值或正值。
例如,字符串值'023N'
表示整数值+235
。 (最右边的'N'字符表示数字值为5,带有正号)。字符串值'104}'
表示整数值-1040
。 (最右边的'}'
charcacter表示数字值为'0',并且使整体值为负。)
下面是显示所需转换的表格。
Code Digit Sign
'}' '0' -
'J' '1' -
'K' '2' -
'L' '3' -
'M' '4' -
'N' '5' -
'O' '6' -
'P' '7' -
'Q' '8' -
'R' '9' -
'{' '0' +
'A' '1' +
'B' '2' +
'C' '3' +
'D' '4' +
'E' '5' +
'F' '6' +
'G' '7' +
'H' '8' +
'I' '9' +
这里的例子值的表:
Create Table #Punch
(
aa varchar(20)
)
Insert Into #Punch values ('046')
Insert into #Punch values ('027')
Insert into #Punch values ('004')
Insert into #Punch values ('020')
Insert into #Punch values ('090')
这是SQL语句不进行转换,但它不具有只是普通的数字字符的字符串正常工作。 (上面的示例表是应该被转换为整数值的其它字符串的例子。
该SQL语句的字符串046
返回的184
一个整数值,当我希望它返回46
。
问:为什么我的SQL语句的字符串'046'
select
aa, Answervalue =
(cast(
substring(aa, 1, len(aa)-1) +
case
when right(aa,1) in ('{','}','0') then '0'
when right(aa,1) between 'A' and 'I' then cast(ascii(right(aa,1))-64 as char(1))
when right(aa,1) between 'J' and 'R' then cast(ascii(right(aa,1))-73 as char(1))
else ''
end
as int) *
case
when right(aa,1) in ('{','0') or right(aa,1) between 'A' and 'I' then 1
when right(aa,1) in ('}') or right(aa,1) between 'J' and 'R' then -1
when aa in (aa) then aa
end)
from
(
select aa from #Punch
) bb
01返回的
184
,而不是
46
的整数值?
对于给定的插入值,“046”的结果为“184”。它应该是“46”。对于“004”,结果是“0”。它应该是“4”。除了这些问题,逻辑工作正常。如果列值aa是数字,并且值中没有代码\字符(例如{,A,N,B等),我想将其作为原始值。所以如果它是046那么值应该是46.
谢谢你提前!
你需要描述你的逻辑,只是因为你的代码不会产生你期望的结果,我们无法猜测代码的逻辑部分失败 – 2014-03-24 18:09:44
对于给定的插入值,“046”的结果为“184”。它应该是“46”。对于“004”,结果是“0”。它应该是“4”。 – ETLUser
为什么?你只是说了你的期望,但现在你如何到达那里。 – 2014-03-24 18:18:01