Tabelas curinga
Com uma tabela curinga, é possível consultar várias tabelas usando instruções SQL concisas. A tabela curinga representa uma união de todas as tabelas correspondentes à expressão curinga.
Tabelas curinga estão disponíveis apenas no SQL padrão. Para funcionalidade equivalente no SQL legado, consulte Funções de tabelas curinga.
Para uma visão geral das tabelas curinga, consulte Como consultar várias tabelas usando uma tabela curinga.
Sintaxe da tabela curinga
Sintaxe da tabela curinga:
SELECT FROM `<project-id>.<dataset-id>.<table-prefix>*` WHERE bool_expression
- <project-id>
- ID do projeto do Cloud Platform. É opcional se você usa o ID do projeto padrão.
- <dataset-id>
- ID do conjunto de dados do BigQuery.
- <table-prefix>
- Uma string comum em todas as tabelas que corresponde ao caractere curinga. O prefixo da tabela é opcional. Todas as tabelas no conjunto de dados serão correspondentes se o prefixo da tabela for omitido.
- * (caractere curinga)
- Representa um ou mais caracteres do nome de uma tabela. O caractere curinga só pode ser usado como caractere final do nome de uma tabela curinga.
As consultas com tabelas curinga são compatíveis com a pseudocoluna _TABLE_SUFFIX
na cláusula WHERE
. Essa coluna contém os valores correspondentes ao caractere curinga, para que as consultas possam filtrar quais tabelas são acessadas. Por exemplo, as seguintes cláusulas WHERE
usam operadores de comparação para filtrar as tabelas correspondentes:
WHERE
_TABLE_SUFFIX BETWEEN '29' AND '40'
WHERE
_TABLE_SUFFIX = '1929'
WHERE
_TABLE_SUFFIX < '1941'
Para saber mais sobre a pseudocoluna _TABLE_SUFFIX
, consulte Como filtrar tabelas selecionadas com _TABLE_SUFFIX.
Colocar nomes de tabela com caracteres curinga entre acentos graves
O nome da tabela curinga contém o caractere especial (*), que indica a necessidade de incluir o nome da tabela curinga entre acentos graves (`). Por exemplo, a consulta a seguir é válida porque usa os acentos graves:
#standardSQL /* Valid standard SQL query */ SELECT max FROM `bigquery-public-data.noaa_gsod.gsod*` WHERE max != 9999.9 # code for missing data AND _TABLE_SUFFIX = '1929' ORDER BY max DESC
Por outro lado, a consulta a seguir NÃO é válida porque não usa os acentos graves corretamente:
#standardSQL /* Syntax error: Expected end of statement but got "-" at [4:11] */ SELECT max FROM # missing backticks bigquery-public-data.noaa_gsod.gsod* WHERE max != 9999.9 # code for missing data AND _TABLE_SUFFIX = '1929' ORDER BY max DESC
Aspas simples não funcionam:
#standardSQL /* Syntax error: Unexpected string literal: 'bigquery-public-data.noaa_gsod.gsod*' at [4:3] */ SELECT max FROM # quotes are not backticks 'bigquery-public-data.noaa_gsod.gsod*' WHERE max != 9999.9 # code for missing data AND _TABLE_SUFFIX = '1929' ORDER BY max DESC
Como migrar funções de tabelas curinga do SQL legado
No SQL legado, use as funções de tabelas curinga a seguir para consultar várias tabelas.
TABLE_DATE_RANGE()
eTABLE_DATE_RANGE_STRICT()
TABLE_QUERY()
As funções "TABLE_DATE_RANGE()"
As funções TABLE_DATE_RANGE()
do SQL legado funcionam em tabelas que obedecem a um esquema de nomenclatura específico: <prefix>YYYYMMDD
, em que <prefix>
representa a primeira parte de um nome de tabela e YYYYMMDD
representa a data associada a dados.
Por exemplo, a consulta do SQL legado a seguir encontra a temperatura média em um conjunto de tabelas diárias que contêm dados climáticos da área de Seattle:
#legacySQL
SELECT
ROUND(AVG(TemperatureF),1) AS AVG_TEMP_F
FROM
TABLE_DATE_RANGE([mydataset.sea_weather_],
TIMESTAMP("2016-05-01"),
TIMESTAMP("2016-05-09"))
No SQL padrão, uma consulta equivalente usa um caractere curinga de tabela e a cláusula BETWEEN
.
#standardSQL
SELECT
ROUND(AVG(TemperatureF),1) AS AVG_TEMP_F
FROM
`mydataset.sea_weather_*`
WHERE
_TABLE_SUFFIX BETWEEN '20160501' AND '20160509'
A função "TABLE_QUERY()"
A função TABLE_QUERY()
do SQL legado permite que você encontre nomes de tabelas com base em padrões. Ao migrar um TABLE_QUERY()
para SQL padrão, que não é compatível com a função TABLE_QUERY()
, é possível filtrar usando a pseudocoluna _TABLE_SUFFIX
. Tenha em mente as seguintes diferenças ao migrar:
No SQL legado, você coloca a função
TABLE_QUERY()
na cláusulaFROM
, enquanto no SQL padrão, você filtra usando a pseudocoluna_TABLE_SUFFIX
na cláusulaWHERE
.No SQL legado, a função
TABLE_QUERY()
opera no nome da tabela inteira (outable_id
), enquanto no SQL padrão, a pseudocoluna_TABLE_SUFFIX
contém parte ou todo o nome da tabela, dependendo de como você usa o caractere curinga.
Filtro na cláusula "WHERE"
Ao migrar do SQL legado para o SQL padrão, mova o filtro para a cláusula WHERE
. Por exemplo, a consulta a seguir encontra as temperaturas máximas nos anos que terminam com o número 0
:
#legacySQL
SELECT
max,
ROUND((max-32)*5/9,1) celsius,
year
FROM
TABLE_QUERY([bigquery-public-data:noaa_gsod],
'REGEXP_MATCH(table_id, r"0$")')
WHERE
max != 9999.9 # code for missing data
AND max > 100 # to improve ORDER BY performance
ORDER BY
max DESC
No SQL padrão, uma consulta equivalente usa um caractere curinga de tabela e coloca a função de expressão regular, REGEXP_CONTAINS()
, na cláusula WHERE
:
#standardSQL
SELECT
max,
ROUND((max-32)*5/9,1) celsius,
year
FROM
`bigquery-public-data.noaa_gsod.gsod*`
WHERE
max != 9999.9 # code for missing data
AND max > 100 # to improve ORDER BY performance
AND REGEXP_CONTAINS(_TABLE_SUFFIX, r"0$")
ORDER BY
max DESC
Diferenças entre "table_id" e "_TABLE_SUFFIX"
Na função TABLE_QUERY(dataset, expr)
do SQL legado, o segundo parâmetro é uma expressão que opera sobre o nome inteiro da tabela, usando o valor table_id
. Ao migrar para o SQL padrão, o filtro criado na cláusula WHERE
opera no valor de _TABLE_SUFFIX
, que pode incluir parte ou todo o nome da tabela, dependendo de como você usa o caractere curinga.
Por exemplo, a consulta do SQL legado a seguir usa todo o nome da tabela em uma expressão regular para encontrar as temperaturas máximas em todos os anos que terminam com o número 0
:
#legacySQL
SELECT
max,
ROUND((max-32)*5/9,1) celsius,
year
FROM
TABLE_QUERY([bigquery-public-data:noaa_gsod],
'REGEXP_MATCH(table_id, r"gsod\d{3}0")')
WHERE
max != 9999.9 # code for missing data
AND max > 100 # to improve ORDER BY performance
ORDER BY
max DESC
No SQL padrão, uma consulta equivalente pode usar o nome inteiro da tabela ou somente uma parte dele. Use um prefixo vazio no SQL padrão para que o filtro funcione em todo o nome da tabela:
# Standard SQL empty prefix
FROM
`bigquery-public-data.noaa_gsod.*`
Os prefixos maiores têm melhor desempenho que os vazios, portanto, no exemplo a seguir, usamos um prefixo maior, o que significa que o valor de _TABLE_SUFFIX
é apenas parte do nome da tabela.
#standardSQL
SELECT
max,
ROUND((max-32)*5/9,1) celsius,
year
FROM
`bigquery-public-data.noaa_gsod.gsod*`
WHERE
max != 9999.9 # code for missing data
AND max > 100 # to improve ORDER BY performance
AND REGEXP_CONTAINS(_TABLE_SUFFIX, r"\d{3}0")
ORDER BY
max DESC
Limitações
Consulte a seção de limitação em Como consultar várias tabelas usando uma tabela curinga.