簡體   English   中英

使用帶有 BigQuery 中任何可能內容的字符串進行過濾

[英]Filter using string with any possible content in BigQuery

我是使用 BigQuery 的新手。

我正在構建一個查詢,我將與其他幾個人共享。 每個人負責不同的業務部門,我希望他們能夠輕松地在此查詢中插入其業務部門的名稱。

我構建了這樣的東西,根據我的測試,它運行良好:

DECLARE business_units array<string>;

SET business_units = ["unit_A", "unit_C", "unit_D"];
    
SELECT *
FROM dataset
WHERE bu_name IN UNNEST(business_units)

問題

我還希望能夠輕松更改該查詢以搜索所有可能的業務部門。

理想情況下,我只想更改“SET”行。 我嘗試了不同的方法,但似乎都不起作用。 我相信我需要使用元字符或正則表達式,但我找不到正確的組合。 我已經查看了 BigQuery 文檔,但我無法理解如何執行此操作。

我試過這樣的事情:

SET business_units = ["."];
SET business_units = ["*"];
SET business_units = ["\."];
SET business_units = ["%%"];

當我使用其中任何一個時,我的結果返回為空。

有人可以指出我正確的方向嗎?

這里有很多選擇。 我將向您展示那些對您的原始解決方案進行了最小更改的

選項1

DECLARE business_units array<string>;

SET business_units = ["unit_A", "unit_C", "unit_D", "ALL_UNITS"]; 

SELECT *
FROM dataset
WHERE bu_name IN UNNEST(business_units)
OR "ALL_UNITS" IN UNNEST(business_units);   

正如您在此處看到的那樣 - 當您需要所有單位時 - 在您的 SET 行中添加“ALL_UNITS”

選項 #2

DECLARE business_units array<string>;
DECLARE all_units boolean;

SET business_units = ["unit_A", "unit_C", "unit_D"]; 
SET all_units = TRUE;

SELECT *
FROM dataset
WHERE bu_name IN UNNEST(business_units)
OR all_units;     

在這里 - 你還有一個參數all_units 當您想查看所有單位時 - 只需將其設置為 TRUE,否則設置為 FALSE

IN不能使用LIKE或正則表達式處理列表, LIKE或正則表達式不能將 arrays 作為參數。

直接的方法是在未嵌套的列表上使用JOIN

DECLARE business_units array<string>;

SET business_units = ["unit_A", "unit_C", "unit_D"];
    
SELECT
  *
FROM
  dataset
INNER JOIN
  UNNEST(business_units)  AS param_pattern
    ON dataset.buname LIKE param_pattern

如果一行與數組中的多個元素匹配,您將得到重復(每個數據集行與它匹配的每個模式連接)。

你如何處理這取決於你。 您可能只有SELECT DISTINCT dataset.* ,但您的問題不包括這一點。 (如果您不確定如何繼續,請在這部分工作后打開另一個問題。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM