Localizar colunas por nome ou tipo de dados no SQL
Descubra como localizar uma coluna por nome ou tipo de dados em qualquer tabela de seu banco de dados
Neste artigo vamos ver como resolver dois problemas comuns para quem trabalha com banco de dados SQL. Vamos ver como localizar uma tabela com base no nome de um de seus campos, e vamos aprender como listar colunas de um determinado tipo de dados.
O que você vai aprender neste artigo?
* Como localizar uma tabela de acordo com o nome de uma coluna
* Como listar colunas de um determinado tipo de dados.
Os exemplos a seguir foram feitos no MySQL e no SQL SERVER
Localizar uma tabela de acordo com o nome de uma coluna
No MySQL podemos usar o INFORMATION_SCHEMA para obter informações sobre a estrutura de nosso banco de dados. O INFORMATION_SCHEMA é um banco de dados somente leitura que fornece acesso aos METADADOS do servidor, então nele você vai encontrar informações sobre a estrutura, tipo de dados e permissões das tabelas.
Na consulta a seguir vamos retornar o nome da tabela e o tipo de dados da coluna que desejamos localizar.
SELECT
table_schema,
table_name,
column_name,
data_type,
ordinal_position
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name like "%nome%"
No SQL Server também existe o INFORMATION_SCHEMA, então a consulta também pode ser feita da mesma forma
SELECT table_schema,
table_name,
column_name,
data_type,
ordinal_position
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%Nome%'
A consulta retornou as seguintes informações:
TABLE_SCHEMA - Nome do banco de dados
TABLE_NAME - Nome da tabela
COLUMN_NAME - Nome da coluna
DATA_TYPE - Tipo de dados
ORDINAL_POSITION - Ordem da coluna na tabela
Uma outra forma de fazer isso no SQL Server é utilizar as tabelas de sistema SYS.TABLES e SYS.COLUMNS, elas guardam informações sobre cada tabela e coluna de seu banco de dados
SELECT t.name AS tabela, c.name AS coluna
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.name LIKE '%Nome%'
ORDER BY tabela,coluna
Listar colunas de um determinado tipo de dados
Como vimos nos exemplos anteriores o INFORMATION_SCHEMA guarda dados sobre as estruturas das tabelas, então ele vai ser útil para identificar colunas de um determinado tipo de dados. No exemplo a seguir vamos listar colunas com o tipo de dados numérico utilizando o banco de dados MySQL
select col.table_schema as database_name,
col.table_name,
col.ordinal_position as col_id,
col.column_name,
col.data_type,
col.numeric_precision,
col.numeric_scale
from information_schema.columns col
join information_schema.tables tab on tab.table_schema = col.table_schema
and tab.table_name = col.table_name
and tab.table_type = "BASE TABLE"
where col.data_type in ("tinyint", "smallint", "mediumint", "int", "bigint", "decimal", "bit", "float", "double")
and col.table_schema not in ("information_schema", "sys", "performance_schema", "mysql")
order by col.table_schema, col.table_name, col.ordinal_position
Perceba que para retornar o resultado fizemos o vínculo de duas tabelas, que foram information_schema.columns e information_schema.tables. Os tipos de dados númericos no MySQL são "tinyint", "smallint", "mediumint", "int", "bigint", "decimal", "bit", "float" e "double"
No SQL Server também podemos utilizar o INFORMATION_SCHEMA, a diferença vai ser os tipos de dados, que possuem nomes um pouco diferentes. No exemplo a seguir vamos listar colunas com o tipo de dados numéricos.
SELECT
TABLE_CATALOG,
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('bigint', 'int','smallint', 'tinyint', 'decimal', 'numeric','smallmoney', 'money', 'bit', 'float', 'real')
Os tipos de dados numéricos no SQL Server são "bigint", "int", "smallint", "tinyint", "decimal", "numeric", "smallmoney", "money", "bit", "float" e "real"
Também é possível chegar no mesmo resultado no SQL Server utilizando as tabelas SYS.TABLES e SYS.COLUMNS. A seguir veremos um exemplo de como fazer isso.
select schema_name(t.schema_id) + '.' + t.name as tabela,
c.column_id,
c.name as coluna,
type_name(user_type_id) as tipo_dados,
max_length,
precision,
scale
from sys.columns c
join sys.tables t
on t.object_id = c.object_id
where type_name(user_type_id) in ('bigint', 'int','smallint', 'tinyint', 'decimal', 'numeric','smallmoney', 'money', 'bit', 'float', 'real')
order by tabela, c.column_id
Encerramento
Neste artigo você viu como localizar colunas por nome ou tipo de dados no SQL.
Se este artigo foi útil, com certeza os artigos a seguir também devem despertar o seu interesse.
Como listar o tamanho das tabelas no SQL Server e no MySQL
Localizando tabela por data de criação com SQL Server ou MySQL