Я бы пропустил оператор where и создал бы один столбец для числового почтового индекса и один для другого.Вот так:
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´
Редактировать 1
Я знаю, что это приведет к двум столбцам.Но вы не можете иметь типы данных в одном столбце.Но я думаю, что вы можете сделать это примерно так же.
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]
Это сработает, потому что числовое значение равно 0 как varchar.
Редактировать 2
Вы также можете сделать это так:
SELECT CAST('asdasd' AS sql_variant)
UNION ALL
SELECT CAST(0 AS sql_variant)
Но это грязное решение этой проблемы.Sql_variant является объектом базы данных.Итак, мой вывод таков: используйте столбцы, если вам нужны разные типы данных.Если значения могут быть одинакового типа данных, используйте один и тот же столбец.Не используйте sql_variant для решения подобных проблем.Вы будете платить высокую цену за поддержание кода.
Надеюсь, что эта помощь.