繁体   English   中英

在 BigQuery 上使用具有多个条件的 Function

[英]Use Function with multi conditions on BigQuery

ALTER FUNCTION [dbo].[studentinformation]
    (@name as varchar (50)= NULL
     @surname as varchar (50) = NULL
     @schoolsname as varchar = NULL)
RETURNS **NVARCHAR(255)** 
AS
BEGIN
    DECLARE @ret AS **NVARCHAR(255)** = NULL    

    --Condition 1
    SELECT @ret = name + " " + surname
    FROM dbo.dataset_red as rd WITH(NOLOCK)
    INNER JOIN dbo.dataset_blue as bl WITH(NOLOCK) on rd.dataset = bl.dataset
    WHERE red.dataset IS NOT NULL

    IF @ret IS NOT NULL
    BEGIN
        RETURN @ret
    END

    --Condition 2
    SELECT @ret = name + " " + surname
    FROM dbo.dataset_red as rd WITH(NOLOCK)
    LEFT OUTER JOIN dbo.dataset_green as gr WITH(NOLOCK) on rd.zone = gr.zone
    WHERE red.dataset IS NOT NULL

    IF @ret IS NOT NULL
    BEGIN
        RETURN @ret
    END

    --Condition 3
    SELECT @ret = name + " " + surname
    FROM dbo.dataset_red as rd WITH(NOLOCK)
    LEFT OUTER JOIN dbo.dataset_yellow as yl WITH(NOLOCK) on rd.zone = yl.zone
    WHERE red.dataset IS NOT NULL

    RETURN @ret
END

描述我的问题:

  • 我有 function,它来自 3 个从不同表获取值的条件。
  • 这个 function 具有从条件 1 到条件 3 的层级顺序。

我的问题:

  • 我需要将此 T-SQL function 转换为 BigQuery

要创建具有多个条件的 function,您可以使用CASE检查多个条件。 使用此示例数据,我有 2 个表。

表格1:

在此处输入图像描述

表 2:

在此处输入图像描述

考虑下面的方法,我在其中设置了两个条件,当它返回一个值时将运行查询。 如果不匹配,它将返回 null:

注意:以下查询仅用于测试,您可以添加更多条件。 根据条件使用您自己的查询来实现您的目标。

CREATE TEMP FUNCTION getStudentInfo(firstname STRING, surname STRING, schoolname STRING)
AS (
(

    case 
        when -- 1st condition
            exists(select name from `my-project.sandbox.table1` where name = concat(firstname, ' ', surname))
        then 
            (select name from `my-project.sandbox.table1` where name = concat(firstname, ' ', surname))

        when -- 2nd condition
            exists(select name from `my-project.sandbox.table2` where name = concat(firstname, ' ', surname))
        then
            (select name from `my-project.sandbox.table2` where name = concat(firstname, ' ', surname))
    end
)

);

select getStudentInfo('chris', 'paul', 'phx') as match_1,
       getStudentInfo('lebron', 'james', 'lal') as match_2,
       getStudentInfo('michael', 'jordan', 'chi') as match_3,
       getStudentInfo('tim', 'duncan', 'sas') as match_4;

样本 output:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM