исключает ли наличие звездочки в выборе другие столбцы?

Этот вопрос все о лени... Я хотел бы сделать что-то вроде этого:

select some_func(some_col), * from my_table

Чтобы мне не пришлось это делать:

select some_func(some_col), col_1, col_2... col_ad_infinitum from my_table

Есть ли способ заставить работать первый запрос? Это ошибка, которую я получаю при запуске:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from my_table' at line 1

person andersonbd1    schedule 27.09.2011    source источник
comment
Первый запрос должен работать нормально как есть. Вы имеете в виду, что хотите, чтобы some_col было исключено из * части запроса? Если да, то нет, вы не можете этого сделать. Это хорошо обсуждаемый вопрос, и единственным ленивым подходом является использование динамического SQL для создания списка столбцов в запросе.   -  person mellamokb    schedule 28.09.2011
comment
Ваш первый запрос должен работать. Вы пробовали?   -  person Joe Stefanelli    schedule 28.09.2011
comment
какова цель Select? Что оно делает? Возвращает ли он данные в приложение? отчет? Если вы измените my_table, ваш запрос теперь будет возвращать больше столбцов, чем раньше, и это, как правило, все испортит. Это ошибка, которая только и ждет, чтобы случиться.   -  person Stephanie Page    schedule 28.09.2011
comment
Я не понимаю, как генерация выборки с динамическим sql считается ленивой.   -  person Stephanie Page    schedule 28.09.2011
comment
Ленивый вместо (не ленивого) ввода 50 названий столбцов :)   -  person ypercubeᵀᴹ    schedule 28.09.2011
comment
@mellamokb: первый запрос не выполняется как есть. Он выдает ошибку как в версиях 5.1, так и в версиях 5.5 MySQL.   -  person ypercubeᵀᴹ    schedule 28.09.2011
comment
@Stephanie: ИМО, автоматизация всегда ленивее, чем делать что-то вручную, даже если настройка автоматизации занимает намного больше времени. Думаю, это перспективно :-)   -  person mellamokb    schedule 28.09.2011
comment
@mellamokb Не был уверен, хорошо это или плохо. Я написал запрос клиента в своей среде IDE, поэтому, когда я щелкаю правой кнопкой мыши по таблице, я могу вернуть столбцы, объединенные запятыми. Лениво да, но по-хорошему, программистски.   -  person Stephanie Page    schedule 29.09.2011


Ответы (4)


Вы имеете в виду, что в MySQL ваш первый запрос:

SELECT some_func(some_col), * 
FROM my_table

выдает эту ошибку?:

Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '*' в строке 1


Вы можете изменить свой код на (это не приводит к ошибкам!):

SELECT *, some_func(some_col) 
FROM my_table

или в это, если вы хотите сначала иметь вычисляемые столбцы:

SELECT some_func(some_col), t.* 
FROM my_table AS t
person ypercubeᵀᴹ    schedule 27.09.2011
comment
Любое предложение, почему MySQL выдает здесь ошибку? Предложение FROM должно быть достаточно четким, чтобы решить, какую таблицу я имел в виду... - person karatedog; 19.03.2016

К сожалению, mysql поддерживает только звездочку в начале списка столбцов (в отличие от любой другой БД, с которой я знаком).

(Отредактировано: начало, а не конец — упс!)

person Bohemian♦    schedule 27.09.2011
comment
Вы имеете в виду в начале, а не в конце. - person ypercubeᵀᴹ; 28.09.2011
comment
Вероятно, это связано с тем, что любая другая БД, с которой вы знакомы, не может ссылаться на предыдущие поля выбора в том же запросе, что и mysql :-) - person mellamokb; 28.09.2011
comment
@mellamokb: Что ты имеешь в виду? Можете ли вы привести пример запроса с такой ссылкой, который работает в MYSQL? - person ypercubeᵀᴹ; 28.09.2011
comment
В MYSQL вы можете сделать что-то вроде select 1 as myval, myval + 2 as myval2, где myval во втором поле является прямой ссылкой на выходное значение первого поля. Я знаю, что вы не можете сделать это в SQL Server, но я не уверен в других системах БД. - person mellamokb; 28.09.2011
comment
Это кажется опасным. Что, если в одной из таблиц есть столбец с именем myval? Я надеюсь, что в этом случае запрос просто завершится ошибкой с неоднозначной ссылкой... - person Aaron Bertrand; 28.09.2011
comment
@mellmokb: это не только опасно, но и не соответствует стандартам SQL. Я не могу проверить сейчас, но я серьезно сомневаюсь, что вы действительно можете сделать это в MySQL. Вы, вероятно, имеете в виду использование переменных. (@myval). - person ypercubeᵀᴹ; 28.09.2011
comment
@ypercube: Да, на самом деле похоже, что ты прав (проверено на sqlzoo.net). Я думаю, что имел в виду MS Access, который позволяет вам ссылаться на предыдущие поля, но также не имеет проблем с отображением * позже в списке полей... иди разберись! - person mellamokb; 29.09.2011

Измените порядок выбранных вами параметров:

select *,some_func(some_col) from my_table

В любом случае, как говорится в Дзен Python: "Явное лучше, чем неявное". . Всегда старайтесь записывать поля, которые вы выбираете, и, если это возможно, попробуйте также указать таблицу, из которой они взяты, вы можете использовать псевдоним. Ваше будущее ВЫ будете благодарны вам.

select t.some_col from my_table t
person santiagobasulto    schedule 27.09.2011

Когда я делаю это с PostgreSQL, я получаю указанный столбец (столбцы), за которым следуют все остальные столбцы (возможно, повторяя указанные столбцы).

person pedz    schedule 27.09.2011