また、私がしようとしていることを達成するためのよりよい方法がありますか?
私はそう思います - はい - JS UDFを使用するのは高価なリソースであり、いくつかの制限があります。使用してSQL UDFは、安価であり、あなたはあなたがSQL UDFを使用することにより、以下の変換することができますしたい場合 - しかし、少なくとも以下のあなたにBigQueryの標準SQL
#standardSQL
WITH yourTable AS (
SELECT 1 AS id, 'a=1&c=1' AS querystring UNION ALL
SELECT 2, 'c=2&b=3'
)
SELECT
id,
querystring,
SPLIT(kv, '=')[SAFE_OFFSET(0)] AS key,
SPLIT(kv, '=')[SAFE_OFFSET(1)] AS value
FROM yourTable, UNNEST(SPLIT(querystring, '&')) AS kv
は、上記のことができますについては、「代替」アプローチ
のアイデアを提供しますあなたはだから今、あなたが
0以下のようなWHERE句でそれらを使用することができ
id querystring key value
2 c=2&b=3 b 3
1 a=1&c=1 c 1
1 a=1&c=1 a 1
2 c=2&b=3 c 2
以下のようにすべてのキーと値のペアを「抽出」します
これは
id querystring
1 a=1&c=1
注結果の下に与える:これはアプローチのちょうど迅速かつ抽象的実例である - 私はあなたの特定のケース
以下
に採用/それを調整することを願っていますが、に上記変換の一例です通常のキーの重複を持っていないクエリ文字列 - そうDUPを有する場合には対処されていない - しかし、簡単に、必要な場合に:SQL UDF
#standardSQL
CREATE TEMPORARY FUNCTION parse(qs STRING, key STRING) AS (
(SELECT SPLIT(kv, '=')[SAFE_OFFSET(1)] FROM UNNEST(SPLIT(qs, '&')) AS kv WHERE SPLIT(kv, '=')[SAFE_OFFSET(0)] = key)
);
WITH yourTable AS (
SELECT 1 AS id, 'a=1&c=1' AS querystring UNION ALL
SELECT 2, 'c=2&b=3'
)
SELECT
id,
querystring
FROM yourTable
WHERE parse(querystring, 'c') = '1'
注意を使用O)
ただし、エンコードされたコンポーネントはデコードされないため、値には%20などの値が含まれます。それに関する提案はありますか?
#standardSQL
CREATE TEMPORARY FUNCTION parse(qs STRING, key STRING) AS (
(SELECT SPLIT(kv, '=')[SAFE_OFFSET(1)] FROM UNNEST(SPLIT(qs, '&')) AS kv WHERE SPLIT(kv, '=')[SAFE_OFFSET(0)] = key)
);
CREATE TEMP FUNCTION decode(str STRING)
RETURNS STRING
LANGUAGE js AS """
if (str == null) return null;
try {
return decodeURIComponent(str);
} catch (e) {
return str;
}
""";
WITH yourTable AS (
SELECT 1 AS id, 'a=1&c=1&d=a%20b%20c' AS querystring UNION ALL
SELECT 2, 'c=2&b=3'
)
SELECT
id,
querystring,
decode(parse(querystring, 'd')) as d
FROM yourTable
WHERE parse(querystring, 'c') = '1'
結果は、これは素晴らしいアプローチですが、私の値はまだ20%のようなものが含まれていますので、それは、任意のエンコードされたコンポーネントをデコードしない
id querystring d
-- ------------------- -----
1 a=1&c=1&d=a%20b%20c a b c
です。それに関する提案はありますか? –
良い点。あなたの質問を、クエリ文字列からキー/値を解析/抽出する方法にもっと似ていました。 1つの答えですべてのニュアンスをカバーするのは難しいです。私はあなたにURLデコーディングに固有の新しい質問をすることをお勧めします - 私はこれに問題が見られません - あなたは答えを得る良いチャンスを持っています - しかし、私は1つの投稿のすべてのニュアンスをカバーすると言っていたように現実的ではありません: –
私の答えの更新を参照してください:o)。 –