Как написать запрос, чтобы найти все таблицы в БД, которые имеют конкретное имя столбца


12

У меня есть база данных с около 100 таблицами, и мне нужно создать запрос на соединение, чтобы получить конкретные данные из двух из них. Я знаю одно, но не другое. В основном мне нужно что-то вроде:

select <tables> from <database> where exists table.column name;

Как я могу это сделать?


6
Мой ответ предполагал SQL Server. Это СУБД, с которой вы работаете?
Томас Стрингер

Ответы:


21

С помощью information_schema

Это совместимый со стандартами кросс-СУБД способ сделать это.

SELECT table_catalog, table_schema, table_name, column_name
FROM INFORMATION_SCHEMA.columns
WHERE column_name = '<your column name>';

Вы можете увидеть это документально


5
Почему бы не использовать INFORMATION_SCHEMAнаш собственный @AaronBertrand ( sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/… )
Томас Стрингер

2
@ThomasStringer Я согласен, но ОП не пометил вопрос ни одним тегом dbms.
ypercubeᵀᴹ

@ThomasStringer Используйте настоящую базу данных, сразу же PostgreSQL поддерживает столбцы идентификаторов information_schema.columnsс 2006 года. Целое десятилетие, прежде чем он даже реализовал их. Если Microsoft SQL не поддерживает стандарт, возможно, нам следует обратить внимание на это. Другие делают.
Эван Кэрролл

5

Для IBM DB2 вы бы использовали следующее:

select tabschema,tabname from syscat.columns where colname = 'COLUMN_NAME'

Обратите внимание, что в DB2 имена столбцов будут в верхнем регистре, если они не были определены внутри двойных кавычек с чем-то отличным от верхнего регистра. Затем вы должны указать точный регистр имени столбца.


1
Если столбец , где определен с помощью кавычек (которые следует избегать), вы можете использовать ВЕРХНИЙ или UCase функцию для преобразования ColName в верхний регистр: WHERE UPPER(colname) = 'COLUMN_NAME'.
Леннарт

3

Приведенный ниже запрос должен дать вам то, что вы ищете:

use YourDatabase;
go

select
    object_schema_name(t.object_id) + '.' + t.name as table_name,
    c.name as column_name
from sys.tables t
inner join sys.columns c
on t.object_id = c.object_id
where c.name like '%ColumnSearchText%';

Если вы ищете столбцы с точным именем, просто замените WHEREпредложение на:

where c.name = 'ColumnSearchText';

0

в Терадата 15:

SELECT DATABASENAME||'.'||TABLENAME AS FULL_TABLENAME,
COUNT(1) AS NUMBER_OF_COLUMNS
FROM DBC.COLUMNSV
WHERE 1 = 1
AND COLUMNNAME LIKE '%<YOUR COLUMNNAME HERE>%'
GROUP BY 1


0
SELECT * FROM _v_sys_columns WHERE COLUMN_NAME='$COLUMN_NAME'

Пожалуйста, передайте имя столбца этой переменной: $COLUMN_NAME


-3

// Выбираем конкретную таблицу:

SYNTAX:
       SELECT COLUMN_NAME FROM TABLE_NAME WHERE COLUMN_NAME='VALUE';
EXAMPLE:
       SELECT PERSON_NAME FROM PERSON WHERE PERSON_ID=1;

Возможно, вы неправильно прочитали вопрос ОП, ваш ответ не отвечает на заданный вопрос.
Леннарт

-3

Для SQL Server:

SELECT name 
FROM sysobjects 
WHERE id IN 
( 
    SELECT id 
    FROM syscolumns 
    WHERE name = 'EXACT_COLUMN_NAME_TO_SEARCH'
)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.