मैं व्हेयर स्टेटमेंट को छोड़ दूंगा और न्यूमेरिक पोस्टल कोड के लिए एक कॉलम और दूसरे के लिए एक कॉलम बनाऊंगा। इस तरह:
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' है।
2 संपादित करें
आप इसे इस तरह भी कर सकते हैं:
SELECT CAST('asdasd' AS sql_variant)
UNION ALL
SELECT CAST(0 AS sql_variant)
लेकिन यह इस समस्या का एक गंदा समाधान है। sql_variant एक डेटाबेस ऑब्जेक्ट है। तो मेरा निष्कर्ष है:यदि आपके पास अलग-अलग डेटा प्रकार हैं तो कॉलम का उपयोग करें। यदि मान समान डेटा प्रकार हो सकते हैं तो समान कॉलम का उपयोग करें। इस तरह की समस्याओं को हल करने के लिए sql_variant का उपयोग न करें। कोड को बनाए रखने के लिए आपको उच्च कीमत चुकानी पड़ेगी।
उममीद है कि इससे मदद मिलेगी।