Есть ли какой-нибудь правильный способ сделать такой запрос (Фильтровать столбцы Google BigQuery по фильтру регулярных выражений) ...
Нет способа выполнить такой запрос с чистым BigQuery SQL - вы можете отправить запрос , если вы sh.
Между тем, вы можете использовать любую клиентскую библиотеку BigQuery на ваш выбор, чтобы программно построить необходимый оператор выбора и выполнить его - очень простой и выполнимый параметр
. .. или другой способ оптимизировать получение только отфильтрованных столбцов?
Если по какой-то причине вы решили использовать чистый BQ SQL - я вижу только один вариант - выравнивание, как в примере ниже (со слегка измененными фиктивными данными из вашего вопроса)
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 0.3301 TP_001_A, 0.3305 TP_001_B, 0.3309 TP_002_A, 0.3313 TP_002, 0.3317 TP_003, 0.3721 TP_099_B UNION ALL
SELECT 2, 0.3302, 0.3306, 0.3110, 0.3314, 0.3318, 0.3322 UNION ALL
SELECT 3, 0.3303, 0.3307, 0.3311, 0.3315, 0.3319, 0.3323 UNION ALL
SELECT 4, 0.3504, 0.3308, 0.3312, 0.3316, 0.3420, 0.3324
)
SELECT id, TRIM(kv.key, '"') col, kv.value
FROM `project.dataset.table` t,
UNNEST(ARRAY(
SELECT AS STRUCT SPLIT(kv, ':')[OFFSET(0)] key, SPLIT(kv, ':')[OFFSET(1)] value
FROM UNNEST(SPLIT(TRIM(TO_JSON_STRING(t), '{}'))) kv
WHERE STARTS_WITH(SPLIT(kv, ':')[OFFSET(0)], '"TP_001')
)) kv
-- ORDER BY id
с результатом
Row id col value
1 1 TP_001_A 0.3301
2 1 TP_001_B 0.3305
3 2 TP_001_A 0.3302
4 2 TP_001_B 0.3306
5 3 TP_001_A 0.3303
6 3 TP_001_B 0.3307
7 4 TP_001_A 0.3504
8 4 TP_001_B 0.3308
Из моего опыта - вышеприведенный вывод гораздо более полезен для большинства практических случаев использования динамического c списка столбцов, чем если бы он был представлен в столбцах
Очевидно, Вы можете заменить STARTS_WITH(..., '"TP_001')
на REGEXP_CONTAINS, если у вас более сложный фильтр