CREATE TABLE #CorruptData(
TestID VARCHAR(100)
);
GO
INSERT INTO #CorruptData
VALUES ('1'),
('2');
SELECT
CASE
WHEN TestID LIKE '[1-9]%' AND TestID NOT LIKE '0%' THEN CAST(TestID AS INT)
WHEN TestID LIKE '0%' THEN CAST(TestID AS NUMERIC(12,2))
END AS TestID
INTO #FixedData
FROM #CorruptData
SELECT *
FROM #FixedData
答案 0 :(得分:1)
由于CASE语句返回类型的方式,您的1和2被转换为十进制:
CASE
结果类型从类型集中返回最高优先级类型 在result_expressions和可选的else_result_expression中。对于 更多信息,请参阅数据类型优先级。
阅读完整文档:http://technet.microsoft.com/en-us/library/ms181765(v=sql.105).aspx
如果你真的想看到INT,那么只需将从CASE语句返回的内容转换为INT:
CAST(CASE
WHEN TestID LIKE '[1-9]%' AND TestID NOT LIKE '0%' THEN CAST(TestID AS INT)
WHEN TestID LIKE '0%' THEN CAST(TestID AS NUMERIC(12,2))
END AS INT) AS TestID
答案 1 :(得分:0)
Ususaly当您处理不正确或损坏的数据时,您应该尽可能减少对它的假设,并且让正在审查和更改此类数据的用户决定它是什么。
同样@Louie Bao说,你不能在两种或更多种数据类型中使用相同的列。您只需要选择一个。由于需要保留数值,因此列应为NUMERIC []。
所以你的选择是:
INT
和Numeric[]
NUMERIC
列,但出于显示目的,将没有小数部分的数字转换为VARCHAR(),看起来是整数。