合并两个SQL脚本如果在Select查询中使用条件

时间:2012-02-21 07:54:36

标签: sql sql-server-2008 tsql

我有两个脚本如下:

第一个:

SELECT [Fm].[Id], [Sdp].[FirstName], [Sdp].[LastName], [Sdp].[SSN],
[Sdp].[StoreName], [Sdp].[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
WHERE ISNUMERIC([Sdp].[PostalCode])=1;

第二个:

SELECT [Fm].[Id], [Sdp].[FirstName], [Sdp].[LastName], [Sdp].[SSN],
[Sdp].[StoreName], 0, [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
WHERE ISNUMERIC([Sdp].[PostalCode])=0;

这两个脚本之间的区别在于第一个选择带有数字邮政编码的列,第二个选择0用于非数字邮政编码,因此如何在一个脚本中将这两个脚本合并在一起,我不是在谈论{ {1}},我很有兴趣在非数字邮政编码选择0的选择查询中使用某些条件。有人有任何想法吗?

2 个答案:

答案 0 :(得分:7)

我会跳过where语句并为Numeric邮政编码创建一列,为另一列创建一列。像这样:

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来解决这样的问题。您将为维护代码付出高昂的代价。

希望这有帮助。

答案 1 :(得分:5)

在所选列列表中使用case语句并删除where子句:

SELECT [Fm].[Id], [Sdp].[FirstName], [Sdp].[LastName], [Sdp].[SSN],
[Sdp].[StoreName],
case when isnumeric([Sdp].[PostalCode]) = 1 then [Sdp].[PostalCode] else 0 end,
[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