Tabelas curinga

Com as tabelas curinga, você pode consultar várias tabelas usando instruções SQL concisas. Essas tabelas estão disponíveis apenas no SQL padrão. Para ter a funcionalidade equivalente no SQL legado, consulte Funções de caracteres curinga da tabela.

Sintaxe da tabela curinga

Sintaxe da tabela curinga:

SELECT
FROM
  `<project-id>.<dataset-id>.<table-prefix>*`
WHERE
  bool_expression
<project-id>
Código de projeto do Cloud Platform. É opcional se você usa o código de projeto padrão.
<dataset-id>
Código 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.

A cláusula WHERE da tabela curinga também aceita a pseudocoluna _TABLE_SUFFIX, que contém valores cuja correspondência foi feita pelo caractere curinga. Use _TABLE_SUFFIX para filtrar a consulta com um operador de comparação. Por exemplo, as cláusulas WHERE a seguir usam operadores de comparação:

WHERE
  _TABLE_SUFFIX BETWEEN '29' AND '40'

WHERE
  _TABLE_SUFFIX = '1929'

WHERE
  _TABLE_SUFFIX < '1941'

Para saber mais sobre a pseudocoluna _TABLE_SUFFIX, veja 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 seguem o esquema específico de nomenclatura: <prefix>YYYYMMDD, onde <prefix> representa a primeira parte do nome de uma tabela e YYYYMMDD representa a data associada aos dados dessa tabela.

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 encontrar nomes de tabelas com base em padrões. Ao migrar uma função TABLE_QUERY() para o SQL padrão, que não é compatível com a função TABLE_QUERY(), você pode 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 em todo o nome da tabela (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 em todo o nome 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, o exemplo a seguir usa 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
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.