Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Führen Sie zwei SQL-Skripts zusammen, verwenden Sie die If-Bedingung in der Select-Abfrage

Ich würde die Where-Anweisung überspringen und eine Spalte für die numerische Postleitzahl und eine für die andere erstellen. So:

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´

Bearbeiten 1

Ich weiß, dass dies zu zwei Spalten führen wird. Aber Sie können nicht Datentypen in einer Spalte haben. Aber ich denke, dass man es auch so machen kann.

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]

Dies funktioniert, da die numerischen '0' als Varchar sind.

Bearbeiten 2

Sie können es auch so machen:

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

Aber das ist eine schmutzige Lösung für dieses Problem. Die sql_variant ist ein Datenbankobjekt. Meine Schlussfolgerung lautet also:Verwenden Sie die Spalte, wenn Sie unterschiedliche Datentypen haben möchten. Wenn die Werte denselben Datentyp haben können, verwenden Sie dieselbe Spalte. Verwenden Sie sql_variant nicht, um solche Probleme zu lösen. Sie zahlen einen hohen Preis für die Pflege des Codes.

Ich hoffe das hilft.