2012-02-21 5 views
3

У меня есть 2 сценария следующим образом:Merge использование сценария два SQL, если условие Select запроса

Первый один:

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; 

Разница между этим 2 сценарий состоит в том, что первый выбирает столбцы с числовым почтовым кодом, а второй выбирает 0 для нецифрового почтового кода, поэтому как я могу объединить этот сценарий в одном скрипте, я не говорю о Union, мне интересно использовать какое-то условие в select query для выбора нецифрового почтового кода 0. Есть ли у кого-нибудь идеи?

+1

'ISNUMERIC' редко, если вообще когда-либо, функция, которую вы на самом деле хотите назвать. '1d1' является числовым, как' '' '... –

+0

@Damien_The_Unbeliever Да, вы правы, так есть ли какой-нибудь вариант? – Saeid

ответ

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 
7

Я бы пропустить где заявление и создать один столбец для ввода цифр почтового кода и один для другого. Как это:

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´ 

Edit 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.

Edit 2

Вы также можете сделать это следующим образом:

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

Но это грязное решение этой проблемы. Sql_variant - объект базы данных. Поэтому мой вывод: использовать для столбца, если у вас есть разные типы данных. Если значения могут быть одного и того же типа данных, используйте один и тот же столбец. Не используйте sql_variant для решения таких проблем. Вы будете платить высокую цену за поддержание кода.

Надеюсь, что эта помощь.

+0

На самом деле я хочу один столбец для почтового кода, так что у нас есть 2 столбца. – Saeid

+0

Обновлен ответ – Arion

Смежные вопросы