Неоднозначность в Select Query - PullRequest
       0

Неоднозначность в Select Query

1 голос
/ 22 февраля 2012

Это моя тестовая таблица:

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 Ответ

3 голосов
/ 22 февраля 2012

У вас есть два разных типа данных, возвращаемых из вашего первого столбца в первом запросе - в первом случае возвращается CHAR(10) из [SSN], в случае ELSE большое число INT. Вот почему SQL Server необходимо преобразовать один из двух типов данных в другой.

Что вам нужно сделать, если вы хотите получить обратно 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];

Затем вы возвращаете свои CHAR(10) значения - и ничто не преобразуется в INT (или BIGINT) и, таким образом, теряет свои ведущие нули:

(No column name)
1000000001
2591830061
4431776273
1000000004
1000000005
0123456789
0012345678
1000000008
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...