这是我的测试表:
CREATE TABLE [General].[Test]
(
[Name] NVARCHAR(20) NOT NULL,
[SSN] CHAR(10) NOT NULL,
CONSTRAINT [UK_Test_SSN]
UNIQUE NONCLUSTERED ([SSN]) WITH (IGNORE_DUP_KEY = OFF),
)
我插入了一些值:
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'901223476', N'Lol1');
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'2591830061', N'Lol2');
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'4431776273', N'Lol3');
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'987654321', N'Lol4');
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'123456789', N'Lol5');
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'0123456789', N'Lol6');
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'0012345678', N'Lol7');
INSERT INTO [General].[Test] ([SSN], [Name]) VALUES (N'123', N'Lol8');
第一个SELECT
查询:
SELECT
CASE
WHEN [T].[SSN] LIKE REPLICATE('[0-9]',10) THEN [T].[SSN]
ELSE 1000000000 + ROW_NUMBER() OVER(ORDER BY [T].[Name]) END AS [SSN]
FROM [General].[Test] AS [T];
GO
第二个问题:
SELECT [T].[SSN] FROM [General].[Test] AS [T];
我无法理解的模糊性是关于第{6}和第7行的[SSN]
值以0开头
例如,大约第6行第一个查询返回123456789
,第二个查询返回0123456789
,有人可以解释原因吗?我真的需要在第一个查询中获得0123456789
的真实价值,我该怎么办?
答案 0 :(得分:3)
您在第一个查询中从第一列返回两种不同的数据类型 - 在第一种情况下,返回CHAR(10)
的{{1}},[SSN]
情况下大INT编号。这就是SQL Server需要将两种数据类型之一转换为另一种数据类型的原因。
如果要返回ELSE
,您需要做的是CHAR(10)
该数据类型的第二个表达式:
CAST
然后你得到你的SELECT
CASE
WHEN [T].[SSN] LIKE REPLICATE('[0-9]', 10) THEN [T].[SSN]
ELSE CAST(1000000000 + ROW_NUMBER() OVER(ORDER BY [T].[Name]) AS CHAR(10))
END
FROM [General].[Test] AS [T];
值 - 并且没有任何东西被转换为INT(或BIGINT),从而失去它的前导零:
CHAR(10)