【问题标题】:Problem Bigquery stored procedure not filtering问题 Bigquery 存储过程未过滤
【发布时间】:2021-12-28 13:26:16
【问题描述】:

我正在尝试使用存储过程从我的客户那里获取一些数据,在查询中按日期和购买渠道过滤表,如下所示:

CREATE OR REPLACE PROCEDURE `sandbox.clients.dateandchannel`
    (IN DT DATE, 
     IN CH STRING)
BEGIN
    SELECT 
        client_id,
        purchase_id,
        purchase_date,
        channel
    FROM 
        `trusted-zone.clients_purchases`
    WHERE 
        channel = CH
        AND purchase_date = DT;
END

运行程序后,我使用以下调用:

CALL `sandbox.clients.dateandchannel`('2021-09-11','Ecommerce');

调用执行并返回一个表,但从不过滤结果。

日期不对应“2021-09-11”,频道不对应“电子商务”

我不明白这是否是查询的问题,或者我在概念上做错了什么,但如果有人知道为什么会发生这种情况,我会很高兴。

对我来说,下一步是将结果表提取到临时表等中,以便在多个查询的其他步骤中使用此结果。例如,在 with 内部。

提前致谢

【问题讨论】:

  • 如果您想在查询中重用结果,为什么不使用视图?
  • @guillaumeblaquiere,这是个好问题。这只是对我想创建的一整套其他程序的第一次初步测试。但是,为了回答您的问题,我使用了程序,以便可以将特定参数传递给它。
  • 查询对我来说看起来不错!我试图重现您的案例并按照您上面描述的方式做了所有事情 - 但它对我来说真的很完美!所以你应该研究数据本身并尝试缩小问题范围
  • 同意,我花时间弯曲查询以重现您的情况,而且不可能...
  • 大家好,很抱歉这么久才回复。我似乎找到了问题所在。我使用了一个未闭合的 OR 子句,这导致了我的过滤问题,而我未能在上面提到的示例中表示这一点。我已经设法正确过滤了结果,并通过我可以在其他查​​询中使用的 TEMP TABLE 将其从调用中取出。非常感谢您的支持。

标签: sql stored-procedures google-cloud-platform google-bigquery


【解决方案1】:

如果你从基础回到语义:

  • 程序执行代码,除了OUT模式下的参数不返回任何内容
  • 函数执行代码并返回一些东西。

因此,按照设计和语义,该程序永远不会向您发送结果!


如果您需要将参数传递给某物并获得一个结果集作为答案,您需要一个函数。 table functions 就是为此而生的!

【讨论】:

  • 感谢纪尧姆的回复。您可能很明显,我不是数据库专家。所以我明白我没有使用最好的选择来做我想做的事。但是你能解释一下为什么这是不可能的吗?我还不太清楚。我的问题是没有输出变量吗?是因为我无法从存储过程中获取表吗?我的 CALL 函数是否以某种方式写错了?因为事情是:我确实从我的调用中得到了一个表,其中包含我在过程中输入的完全相同的列,但是我返回的值没有在 WHERE 子句中被过滤。你能详细说明一下吗?
  • 我的错!!我回答了您的“下一步”问题,但我忘记了您问题的核心!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多