选择查询中的歧义

时间:2012-02-22 06:26:01

标签: sql sql-server-2008 tsql

这是我的测试表:

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的真实价值,我该怎么办?

1 个答案:

答案 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)