Todos os produtos
Search
Central de documentação

Lindorm:Colunas curinga

Última atualização: Jun 28, 2026

Quando o schema de uma tabela possui centenas ou milhares de colunas não definidas previamente — cenário comum em Internet dos Veículos (IoV) —, definir cada coluna antecipadamente torna-se inviável. Adicionar uma nova coluna sempre que necessário com ALTER TABLE gera lentidão e alto custo operacional.

O Lindorm oferece suporte a colunas dinâmicas para escrita e consulta de dados sem um schema fixo, mas essas colunas aceitam apenas dados do tipo VARBINARY. As colunas curinga estendem essa funcionalidade ao permitir declarar um padrão de nomenclatura e um tipo de dados alvo: qualquer coluna gravada na tabela cujo nome corresponda ao padrão é automaticamente aceita e convertida para esse tipo.

Funcionamento

Declare uma coluna curinga na cláusula WITH por meio da propriedade wildcard_column. O nome da coluna contém um ou mais caracteres curinga:

Curinga

Correspondência

*

Sequência de caracteres de qualquer comprimento, inclusive vazia

?

Exatamente um caractere

Por exemplo, declarar c* INT significa que qualquer coluna cujo nome comece com c — como c10, c11 ou c20 — será aceita e terá seu valor convertido para INT.

Durante a escrita, o Lindorm compara o nome da coluna recebida com os padrões declarados. Na consulta, utilize os nomes reais das colunas (e não os padrões curinga) nas cláusulas SELECT e WHERE.

Pré-requisitos

DDL

Crie uma tabela com colunas curinga

A instrução a seguir cria a tabela tb com duas colunas curinga: c2* (BIGINT) e c3* (VARCHAR). Ambas são declaradas na cláusula WITH via wildcard_column.

CREATE TABLE tb (
  pk  INTEGER,
  c1  VARCHAR,
  `c2*` BIGINT,
  `c3*` VARCHAR,
  PRIMARY KEY (pk)
) WITH (wildcard_column='c2*,c3*');

Após a criação desta tabela:

  • Qualquer coluna cujo nome inicie com c2 (por exemplo, c2, c21, c22) será aceita. Caso o valor não seja BIGINT, o sistema o converterá para BIGINT.

  • Colunas com nomes iniciados em c3 (como c32, c33, c35) também são aceitas. Valores diferentes de VARCHAR serão convertidos para VARCHAR.

Crie um índice de busca em colunas curinga

Crie índices de busca em colunas curinga. O índice abrange todas as colunas cujos nomes correspondem aos padrões curinga no momento da escrita.

CREATE INDEX idx USING SEARCH ON tb (`c2*`, `c3*`);
Não é possível criar índices secundários em colunas curinga. A seguinte instrução não tem suporte:
CREATE INDEX idx ON tb (c2*);

DML

Gravar dados

Com a tabela tb criada anteriormente, a instrução UPSERT abaixo grava uma linha com colunas que correspondem a ambos os padrões curinga (c2, c21, c22 correspondem a c2*; c31 corresponde a c3*):

UPSERT INTO tb (pk, c1, c2, c21, c22, c31)
VALUES (1, 'a1', 2, 21, 22, 'c3');

Cada coluna na instrução deve atender a duas condições:

  • O nome deve corresponder a um dos padrões curinga declarados.

  • O valor precisa ser compatível com o tipo de dados da coluna curinga correspondente (ou passível de conversão para ele).

Consultar dados

Nas cláusulas SELECT e WHERE, use os nomes reais das colunas em vez dos padrões curinga. A consulta a seguir lê dados da tabela tb criada e populada acima:

SELECT pk, c1, c2, c21, c31
FROM tb
WHERE c21 > 10 AND c31 < 'c300';

Para consultar todas as colunas em uma tabela que contém colunas curinga, inclua uma cláusula LIMIT:

SELECT * FROM tb LIMIT 10;

Limitações

Limitação

Detalhe

Chaves primárias

Colunas curinga não podem ser usadas como chaves primárias.

SELECT *

Inclua obrigatoriamente uma cláusula LIMIT quando a tabela possuir colunas curinga.

Tipos de índice

Apenas índices de busca têm suporte. Índices secundários não são suportados.

Condições de consulta

Somente nomes reais de colunas podem ser usados em listas SELECT e cláusulas WHERE. Padrões curinga não podem ser utilizados como condições.

As instruções a seguir utilizam padrões curinga como condições de consulta e não têm suporte:

-- Not supported: wildcard pattern in SELECT list
SELECT c1*, c2 FROM tb WHERE c2 > 10;

-- Not supported: wildcard pattern in WHERE clause
SELECT c1*, c2 FROM tb WHERE c1* > 10;

Em vez disso, utilize os nomes reais das colunas:

-- Supported
SELECT pk, c1, c2, c21, c31 FROM tb WHERE c21 > 10 AND c31 < 'c300';