2013-03-19 1 views
5

Я хочу выбрать имена столбцов, но я не знаю структуру таблицы раньше времени, и это может измениться, поэтому я не могу просто жестко закодировать оператор select с именами столбцов. Я также НЕ хочу выбирать каждый столбец. Есть ли и простой способ сделать это?Как динамически выбирать имена столбцов в mySQL

Мои мысли - это какая-то комбинация этих двух запросов, но мой SQL не так уж хорош.

SHOW COLUMNS FROM table_name; 
SELECT * FROM table_name; 

Я пробовал использовать вспомогательный выбор, но он не работал. Кажется, ничего не случится, я не получаю ошибку я просто не получаю результатов

SELECT (SELECT column_name 
     FROM information_schema.columns 
     WHERE table_name ='table_name') 
FROM table_name; 

Может быть, мне нужно сделать присоединиться? .. Во всяком случае любая помощь будет здорово, спасибо

+4

Кажется странным, что структура таблицы постоянно меняется, что звучит как дефект дизайна. Можете ли вы опубликовать свою текущую структуру или предоставить больше контекста для своих таблиц? – Taryn

+0

Это не постоянно меняется. Однако окончательная структура таблиц еще не установлена ​​в камне, и поэтому я пытаюсь создать систему, которая достаточно умна, чтобы адаптироваться к тем, какие изменения могут произойти в будущем. Я не знаю имена столбцов раньше времени. Я мог бы сделать это на PHP с двумя отдельными запросами, но я мог бы также сделать это и на уровне базы данных. Я думал, что могу получить имена столбцов, а затем использовать эти данные для запроса таблицы в основном построить динамический оператор выбора. – TheSnooker

+0

Вы можете сделать это с помощью динамического SQL (это будет эффективно два запроса), но если вам не нужны все столбцы, вам нужно будет ввести код в свой запрос, выбрав столбцы из метаданных, для чего нужны критерии для включения столбца (и любого конкретного заказа, который вы хотите). Но вы не можете напрямую преобразовать результаты запроса в метаданные в список выбора для запроса выбора. –

ответ

2

Попробуйте SQLFiddle :

CREATE TABLE atable (
    prefix1 VARCHAR(10) 
    ,prefix2 VARCHAR(10) 
    ,notprefix3 INT 
    ,notprefix4 INT 
); 

INSERT INTO atable VALUES ('qwer qwer', 'qwerqwer', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'asdfaasd', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'qrt vbb', 1, 1); 
INSERT INTO atable VALUES ('qwer qwer', 'sdfg sdg', 1, 1); 

SELECT CONCAT('SELECT ', GROUP_CONCAT(c.COLUMN_NAME), ' FROM atable;') 
INTO @query 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE c.TABLE_NAME = 'atable' 
    AND c.COLUMN_NAME LIKE 'prefix%' 
ORDER BY c.ORDINAL_POSITION; 

PREPARE stmt FROM @query; 

EXECUTE stmt; 

Некоторые вопросы:

Вы вероятно хотите какой-то ORDER BY на результирующий набор.

Существует ограничение на то, что вы можете сделать с точки зрения объединений и вещей.

Вы переносите проверку во время выполнения, когда ее скорее всего упускают при тестировании.

Вы надеетесь уметь легко обрабатывать изменения схемы. Этот метод будет обрабатывать только изменения схемы определенного типа, которые вы можете предвидеть, и другим, которым вы, вероятно, придется изменить этот код в любом случае.

+0

Да, я понимаю, что вы имеете в виду. У меня были надежда, что я смогу создать своего рода интеллектуальную систему запросов, которая будет захватывать только определенные столбцы на основе набора правил, которые я мог бы определить и изменить. Чем больше я занимаюсь этим подходом, тем больше осознаю, что это, вероятно, создало бы более сложную задачу, чем оно того стоит. Я никогда не думал об использовании CONCAT, хотя и умный. – TheSnooker

+0

Генерация кода @Snooker и динамический SQL имеют место в упрощении обслуживания систем. Фактически, у меня есть целая презентация об использовании метаданных для генерации кода и мониторинга работоспособности кода базы данных. Но я не думаю, что у него есть особое место в будущем, чтобы проверить этот конкретный сценарий. –

 Смежные вопросы

  • Нет связанных вопросов^_^