2013-02-07 45 views
1

說我下表在SQL Server中(2008年):如何動態選擇在SQL中加入哪個列?

Person 

|PersonID|NickName|FirstName|LastName| 
|1  |Jim  |James |Leahy | 
|2  |Mike |Michael |Ross | 
|3  |Bob  |Robert |Helberg | 

我想知道,如果以下是可能的SQL。我有一個主表,我想根據NickNameFirstName列在另一個表上找到匹配。但是,我想要按特定順序將列連接起來。

我想加入的第一列從(NickNameFirstName),將是否有上NickName匹配,然後選擇行下面

|Identifier|PersonId| 
|Jim  |1  | <- should return PersonId = 1 
|Michael |2  | <- should return PersonId = 2 

所以在表的標識符匹配以上。如果NickName沒有匹配,則查看FirstName

有沒有什麼辦法可以按照特定順序在NickNameFirstName列上查詢?

我不認爲COALESCE將起作用,因爲我們無法保證任何列將爲NULL - 我們只知道列中可能不會發生匹配。

如果您需要澄清,請讓我知道;我可能沒有措辭好。

+0

您正在使用哪種RDBMS?如果您使用的是Sql服務器,那麼您可以使用'COALESCE',這裏是[MSDN鏈接](http://msdn.microsoft.com/en-us/library/ms190349.aspx)。 **示例Sql腳本**'從Person中選擇COALESCE(NickName,Firstname)' – Hiten004

+0

謝謝,但我不確定'COALESCE'是否能工作,例如,'NickName'列不是NULL - 它是「 Mike「,但它包含與」FirstName「上的第二張表格匹配的名字」Michael「 –

+0

'Select Person,personId Person,tblIdentifier where Person.NickName = tblIdentifier.Identifier union Select Identifier,PersonId from Person,tblIdentifier where Person.Firstname = tblIdentifier.Identifier'我不確定這是否是正確的解決方案,但您可以使用** union **來達到您的結果。 – Hiten004

回答

1

由於您沒有指定主表模式,我假設它有Identifier varchar(100)字段,其​​中可以包含nicknamefirstname。在這種情況下,query應該看起來像:

select m.identifier, 
PersonId = isnull(p1.PersonID,p2.PersonID) 
from maintable m 
left join persons p1 on p1.nickname = m.identifier 
left join persons p2 on p2.firstname = m.identifier