2017-05-27 130 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

表。我会为每个需求组合一张表格(并不是很多) –

相关问题