Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fusionner deux scripts SQL à utiliser si la condition dans la requête Select

Je sauterais l'instruction where et créerais une colonne pour le code postal numérique et une pour l'autre. Comme ceci :

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´

Modifier 1

Je sais que cela se traduira par deux colonnes. Mais vous ne pouvez pas avoir de types de données dans une colonne. Mais je pense que vous pouvez aussi faire quelque chose comme ça.

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]

Cela fonctionnera car les chiffres sont '0' en tant que varchar.

Modifier 2

Vous pouvez également le faire comme ceci :

SELECT CAST('asdasd' AS sql_variant)
UNION ALL
SELECT CAST(0 AS sql_variant)

Mais c'est une sale solution à ce problème. Le sql_variant est un objet de base de données. Donc ma conclusion est la suivante :utilisez la colonne si vous souhaitez avoir différents types de données. Si les valeurs peuvent être du même type de données, utilisez la même colonne. N'utilisez pas sql_variant pour résoudre des problèmes comme celui-ci. Vous paierez un prix élevé pour maintenir le code.

J'espère que cette aide.