我有一个nvarchar(255)列,用于存储很久以前从excel导入的数字。
格式如下:
7,242
(4,011)
-
(24,120.2)
-
4,234,091
" - "在这里意味着0。
我目前正在使用"替换"使其转换为十进制
convert(decimal(18,4),RTRIM(LTRIM(replace(replace(replace(replace([Column a],'-',0),',',''),'(','-'),')',''))))
无论如何,我认为这有点愚蠢。有更好的方法吗?
答案 0 :(得分:0)
您可以使用Query to get only numbers from a string中功能的修改版本来处理Excel值。
CREATE FUNCTION dbo.udf_GetNumeric
(
@strAlphaNumeric VARCHAR(256)
)
RETURNS VARCHAR(256)
AS
BEGIN
DECLARE @intAlpha INT
SET @intAlpha = PATINDEX('%[^0-9.-]%', @strAlphaNumeric)
BEGIN
WHILE @intAlpha > 0
BEGIN
SET @strAlphaNumeric = STUFF(@strAlphaNumeric, @intAlpha,
1, '')
SET @intAlpha = PATINDEX('%[^0-9.-]%', @strAlphaNumeric)
END
END
RETURN CASE WHEN ISNULL(@strAlphaNumeric,0)='-' THEN 0 ELSE CONVERT(DECIMAL(18,4),@strAlphaNumeric) END
END
GO
然后您可以按如下方式转换您的值:
SELECT dbo.udf_GetNumeric('7,242')
SELECT dbo.udf_GetNumeric('(4,011)')
SELECT dbo.udf_GetNumeric('-')
SELECT dbo.udf_GetNumeric('(24,120.2)')
SELECT dbo.udf_GetNumeric('-')
SELECT dbo.udf_GetNumeric('4,234,091')
实现不一定更好,但它可以更容易理解代码试图实现的目标。