Tôi sẽ bỏ qua câu lệnh where và tạo một cột cho mã bưu chính Numeric và một cột cho mã kia. Như thế này:
SELECT
[Fm].[Id],
[Sdp].[FirstName],
[Sdp].[LastName],
[Sdp].[SSN],
[Sdp].[StoreName],
(
CASE WHEN ISNUMERIC([Sdp].[PostalCode])=1
THEN 0
ELSE NULL
END
) AS NumericPostalCode,
(
CASE WHEN ISNUMERIC([Sdp].[PostalCode])=0
THEN [Sdp].[PostalCode]
ELSE NULL
END
) AS PostalCode,
[Fc].[Id],
[Sdp].[Address]
FROM
[SRM].[SiteMembers].[DProfile] AS [Sdp]
INNER JOIN [SRM].[SiteMembers].[Member] AS [Sm]
ON [Sdp].[Member_Id] = [Sm].[Id]
INNER JOIN [FRM].[Members].[Member] AS [Fm]
ON [Sm].[UserId] = [Fm].[UserId]
INNER JOIN [SRM].[General].[City] AS [Sc]
ON [Sdp].[City_Id]=[Sc].[Id]
INNER JOIN [FRM].[General].[City] AS [Fc]
ON [Fc].[Title]=[Sc].[Title]
COLLATE SQL_Latin1_General_CP1_CI_AS´
Chỉnh sửa 1
Tôi biết rằng điều này sẽ dẫn đến hai cột. Nhưng bạn không thể phải loại dữ liệu trong một cột. Nhưng tôi nghĩ rằng bạn cũng có thể làm điều đó như thế này.
SELECT
[Fm].[Id],
[Sdp].[FirstName],
[Sdp].[LastName],
[Sdp].[SSN],
[Sdp].[StoreName],
(
CASE WHEN ISNUMERIC([Sdp].[PostalCode])=0
THEN [Sdp].[PostalCode]
ELSE '0'
END
) AS PostalCode,
[Fc].[Id],
[Sdp].[Address]
Điều này sẽ hoạt động vì số là '0' dưới dạng varchar.
Chỉnh sửa 2
Bạn cũng có thể làm như thế này:
SELECT CAST('asdasd' AS sql_variant)
UNION ALL
SELECT CAST(0 AS sql_variant)
Nhưng đây là một giải pháp bẩn cho vấn đề này. Sql_variant là một đối tượng cơ sở dữ liệu. Vì vậy, kết luận của tôi là:Sử dụng để cột nếu bạn có những kiểu dữ liệu khác nhau. Nếu các giá trị có thể là cùng một kiểu dữ liệu, hãy sử dụng cùng một cột. Không sử dụng sql_variant để giải quyết các vấn đề như thế này. Bạn sẽ phải trả một cái giá đắt trong việc duy trì mã.
Hy vọng điều này giúp đỡ.