2017-05-27 131 views
0

尋找編寫一個函數,我可以從我的表中的任何兩列調用,以獲得在同一個表中的結果列。 表:Acme 列:CustomerID,LastName,FirstName,EmailAdress,MailingAddress,City,State,ZipSQL函數:使用第1列和第2列給第3列

我可以從FirstName和Last Name獲取EmailAddress嗎? 我可以從CustomerID和City獲得Zip嗎?

我至今爲EmailAddress的:

CREATE FUNCTION fnEmailAddress 
(@LastName varchar (255), @FirstName varchar (255)) 

RETURNS table 

RETURN (SELECT EmailAddress 
FROM Acme 
WHERE FirstName = @FirstName AND LastName = @LastName); 

END

所以下面會給我[email protected]: EXEC fnEmailAddress( '布倫達' + '陳')

但它不工作:(

+0

你的內聯函數有什麼問題? – McNets

+2

懸念真是不可思議!您何時會向您的帖子添加問題? – HABO

+0

@McNets:不知道內聯函數是什麼。 –

回答

1

如果我理解正確的話,你要能夠適應輸入組合的幾種可能性功能,貝科使用你準備好的列作爲輸入可能會在每個函數調用中有所不同。如果是這樣的:

  1. 顯然,你的函數必須有儘可能多的參數,你有可能列,即對任何列可能會成爲一個「列1」或「2列」,添加一個參數。
  2. 由於您有許多參數,您需要決定使用哪些參數,或者如果輸入不合理以開始。例如:
    • 如果您提供4個參數中的4個,該怎麼辦?拒絕工作?或者該功能可以適應這種情況嗎?
    • 如果提供了參數1和4,但是您的功能不適用於該功能,該怎麼辦?例如,它可以用於1 + 2或3 + 4。
  3. 最後,選擇的一個或者:

    • 設置任何不必要的輸入NULL,然後用WHERE子句查詢一旦自動傳遞任何NULL輸入(例如:WHERE COL1 = ISNULL(@PAR1, COL1) AND COL2 = ISNULL(@PAR2, COL2),需要更多的邏輯爲NULL能夠列),
    • 或者,利用IF/ELSE命令到幾個不同的查詢之間切換(不同的查詢可能是維修頭痛,所以儘可能避免)。

下面是一個例子基礎上的東西我已經有了,但它採用了IF/ELSE方法。嘗試做NULL/ISNULL代替:

CREATE FUNCTION [dbo].[SomeWackoName] 
    (@FirstArm tinyint, @SecondArm tinyint, @FirstLeg tinyint, @SecondLeg tinyint) 
RETURNS @Results TABLE(
     [Value] varchar(60) 
) AS 
BEGIN 

    -- For input, we need both arms, or both legs. It is acceptable to provide three inputs. 
    -- It is unacceptable to provide all four inputs (confusing), or failing to provide any full pair (like one input, or two unpaired inputs). 
    DECLARE @Validator tinyint = CASE WHEN @FirstArm + @SecondArm IS NULL THEN 0 ELSE 1 END + CASE WHEN @FirstLeg + @SecondLeg IS NULL THEN 0 ELSE 2 END 
    IF @Validator NOT BETWEEN 1 AND 2 RETURN --THROW 50000, 'INCORRECT INPUT WHYYYYYYYYYYYYYYY WHYYYYYYYYYYYYYYYYYY', 0; 

    -- Depending on input provided, decide how to behave. 
    IF @Validator = 1 
     INSERT INTO @Results SELECT 'I GOT THE ARMS. POPULATE WITH LEGS!!' 
    ELSE IF @Validator = 2 
     INSERT INTO @Results SELECT 'I GOT THE LEGS. POPULATE WITH ARMS!!' 

    -- Return results. 
    RETURN 

END 
+0

謝謝KtX2SkD。我不需要很多列組合的功能。這時只是column1 + column = column3。使用CASE和+以及0 ELSE 1是我必須賺取更多的東西!謝謝!! –

+0

修改了我原來的問題。也許更容易理解我需要什麼?我認爲SQL可以做到這一點...我只是無法弄清楚如何! –

0
CREATE FUNCTION fnEmailAddress 
(
@LastName varchar (255)=null, @FirstName varchar (255)=null, 
@streetNumber varchar(255)=null,@streetname varchar (255)=null 
) 
RETURNS table 
Select case when @[email protected] is not null then EMail Else LastName End Column3 
from person 
where                  
(
case when @[email protected] is not null        
    then case when [email protected] and [email protected] 
       then 1 else 0 End 
    when @[email protected] is not null 
    then case when [email protected] and [email protected] 
       then 1 Else 0 End 
End 
)=1 

的功能應該有4個輸入參數,只有通過前兩個或最後的兩個參數。

取決於輸入參數是否爲空,select語句中的CASE將得到'Email'或'LastName'。

同樣,where語句中的CASE將根據輸入參數null選擇應用哪個過濾器,並根據該結果提取結果。

+0

謝謝JayaPrakash! CASE對於這一個來說太多了,因爲我希望first + last = email或number + street = lastname。基本上我只是想要column1 + column2 = column3都來自同一個數據庫。我將根據我給該功能的人來更改表格或創建表格。 –

+0

您的意思是列名或表名將被傳遞|動態更改@brenda chen – JayaPrakash

+0

表。我會爲每個需求組合一張表格(並不是很多) –

相關問題