2014-01-16 4 views
2

Я думаю, я просто лень, но если я бегу SQL запрос:результаты столбцов перезаписать, если заявление в MySQL

SELECT *, IF(enddate='0000-00-00',null,enddate) as enddate from 
    employees where (enddate is null || enddate > now()) 
    order by name asc 

я, очевидно, в конечном итоге с двумя enddate колоннами.

мне было просто интересно, если есть в любом случае, чтобы перезаписать endate столбец, выбранный * с новым или я должен заменить * с отдельными столбцами?

+1

Я бы предложил ввести нужные поля вместо '*'. –

+0

Кроме того, вы можете использовать 'NULLIF (enddate, '0000-00-00')' :-) –

+1

'SELECT *', как правило, довольно ленивый подход к извлечению данных из БД, так что просто укажите нужные поля. Почему я говорю, что это лениво, так это то, что во многих случаях вы никогда не используете каждый столбец в таблице после извлечения данных, поэтому тратите пропускную способность, память и т. Д. На извлечение этих неиспользуемых данных, в отличие от простого указания полей , Я также считаю, что указание полей дает лучший долгосрочный смысл для ясности кода. Вы можете смотреть свой код в год по линии и точно понимать, с какими данными вы собираетесь работать. –

ответ

1

Нет, нет возможности избежать возврата двух столбцов. Но - если вы используете выборки строки MySQL-драйвер, который использует ассоциативные поля возвращающихся (например, РНР mysqli_result::fetch_assoc), вы можете использовать трюк:

SELECT 
    IF(enddate='0000-00-00',null,enddate) as enddate, 
    employees.* 
    from 
    employees 
    where 
    (enddate is null || enddate > now()) 
    order by name asc 

-Ну забудьте квалифицировать полное имя таблицы (т.е. employees.*, а не только *). Образец можно найти here.

Тогда первое поле будет вашим выражением, а не оригинальным полем. Фактически, это то, что вы увидите в связанном примере SQLFiddle, т. Е. Использует выбор ассоциативных полей, поэтому одно поле переопределяет другое, но это не означает, что в исходном наборе данных будет один столбец (так что в общем случае вы не можете полагаться на то - чтобы убедиться, что вы можете, конечно, использовать mysql клиента)

в общем случае: только полное последовательность полей будет делать вещи (так - да, * не может быть использован)

+0

оказалось, что, поскольку я использую драйвер pdo php, он, похоже, использует последнее вхождение имени столбца, поэтому запрос, который я работал, есть, но это было хорошим решением, тем не менее – andrew

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