Замена NULLIF макросом, который делает то, что говорит NULLIF, избегает исключений и работает так же хорошо:
CREATE TEMPORARY MACRO NULLIFY(s string) if(s = '', null, s);
SELECT
NULLIFY(REGEXP_EXTRACT(LSRC.key, '(^[^\\/]*)\\/(\\d\\/)?([^\\/][^\\/]+)', 1)) AS a_schema_name,
NULLIFY(REGEXP_EXTRACT(LSRC.key, '(^[^\\/]*)\\/(\\d\\/)?([^\\/][^\\/]+)', 3)) AS a_table_name,
NULLIFY(REGEXP_EXTRACT(LSRC.key, '(^[^/]*)/(\\d/)?([^/][^/]+)', 1)) AS b_schema_name,
NULLIFY(REGEXP_EXTRACT(LSRC.key, '(^[^/]*)/(\\d/)?([^/][^/]+)', 3)) AS b_table_name,
NULLIFY(REGEXP_EXTRACT(LSRC.key, "(^[^/]*)/(\d/)?([^/][^/]+)", 1)) AS c_schema_name,
NULLIFY(REGEXP_EXTRACT(LSRC.key, "(^[^/]*)/(\d/)?([^/][^/]+)", 3)) AS c_table_name,
NULLIFY(LSRC.key) AS key
FROM (SELECT 'db/1/table/part/file' key) LSRC;
Результат:
db table db table NULL NULL db/1/table/part/file
В то время как с соответствующая строка:
NULL NULL NULL NULL NULL NULL non-matching
Вместо неудобного результата с пустыми строками
db/1/table/part/file