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() e TABLE_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áusula FROM, enquanto no SQL padrão, você filtra usando a pseudocoluna _TABLE_SUFFIX na cláusula WHERE.

  • No SQL legado, a função TABLE_QUERY() opera no nome da tabela inteira (ou table_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.