如何将case语句与声明的数组一起使用

fslejnso  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(206)

在bigquery中,我想声明一个5位zipcodes的列表,然后在代码其余部分的不同元素中引用该列表。
我试过这样做:

DECLARE monday ARRAY<int>
('98198', '98003', '98023', '98498', 
    '98499', '98402', '98403', '98405', 
    '98406', '98407', '98409', '98421', 
    '98422', '98465', '98466', '98467', 
    '98070', '98418', '98103', '98107', 
    '98117', '98110');

SELECT
  CASE WHEN SUBSTR(o.shipping_address.zip, 0, 5) IN --ARRAY NAMED MONDAY-- THEN 'Monday' END

但似乎不能让它正常工作。现在,我的代码可以反复声明同一个列表,但我知道必须有一种方法来声明一次,然后在任何地方重复使用声明。
谢谢!

uinbv5nw

uinbv5nw1#

我想你想要 unnest() :

case when SUBSTR(o.shipping_address.zip, 1, 5) in (select mon from unnest(monday) mon)

请注意 substr() 开始于 1 .
当然,如果您想让代码正常工作,应该使用正确的键入:

declare monday ARRAY<string>;

set monday = array['98198', '98003', '98023', '98498', 
    '98499', '98402', '98403', '98405', 
    '98406', '98407', '98409', '98421', 
    '98422', '98465', '98466', '98467', 
    '98070', '98418', '98103', '98107', 
    '98117', '98110'];

select *
from unnest(monday) mon;
qgzx9mmu

qgzx9mmu2#

在提供查询之前,我对您的代码有一些考虑。首先,指定一个数组并传递一个字符串元组。其次,我假设您希望传递一个字符串数组,因为您使用了substr()内置方法来接收字符串。最后,据我所知,您将有一个包含星期一邮政编码的静态数组,然后它将用于计算表中每个邮政编码(如果它属于星期一)。
话虽如此,我还是能够在bigquery中使用javascript udf创建一个查询来执行您的目标。下面是standardsql中的查询。

DECLARE monday ARRAY<STRING> DEFAULT ['98198', '98003', '98023', '98498', 
                                      '98499', '98402', '98403', '98405', 
                                      '98406', '98407', '98409', '98421', 
                                      '98422', '98465', '98466', '98467', 
                                      '98070', '98418', '98103', '98107', 
                                      '98117', '98110'];

CREATE TEMP FUNCTION check( monday_code ARRAY<STRING> ,x STRING)
RETURNS BOOL
LANGUAGE js AS """
return monday_code.includes(x);
""";

# Sample data within WITH

WITH post_code AS (
SELECT '123456229' as zip_code UNION ALL
SELECT '123456789' as zip_code UNION ALL
SELECT '98198' as zip_code UNION ALL
SELECT '98003' as zip_code UNION ALL
SELECT '98023' as zip_code
)

SELECT substr(zip_code,1,5) as zip_code,
        CASE WHEN check(monday,SUBSTR(zip_code, 1,5)) THEN 'MONDAY'
        ELSE 'Not identified'
        END AS DAY
from post_code

以及输出,

Row zip_code    DAY
1   12345   Not identified
2   12345   Not identified
3   98198   MONDAY
4   98003   MONDAY
5   98023   MONDAY

注意,我使用了declare方法并指定了默认数组。然后,在javascript udf中,它接收到monday数组和行的当前值。因此,它使用include()内置js方法检查值是否在monday数组中,如果邮政编码在数组中,则返回true,否则返回false。最后,在最后一个select语句中,case when用于指定monday if true,这意味着数组包含传递的值。

相关问题