Неизвестный столбец в списке полей MySQL

У меня есть таблица, содержащая в основном числа с 1 строкой имен столбцов в верхней части.

Я выполнил следующий запрос:

select * , (High - Low) as DiffHL from exdata3; 

(exdata3 - это имя таблицы, а High, Low - существующие столбцы. DiffHL это новый столбец, который я упоминал впервые в этом запросе)

Запрос прошел нормально и добавил новый столбец DiffHL с соответствующими расчетными значениями.

Теперь, когда я запускаю другой запрос после этого

select * from exdata3 where DiffHL >100 

Я получаю следующую ошибку:

ошибка (1054) (42S22) Неизвестный столбец DiffHL в 'предложении where'

Я пытаюсь сделать любой запрос с DiffHL это дает мне ту же ошибку выше. Где я ошибся. Нужно ли создавать DiffHL сначала, прежде чем положить / присвоить значения в нем? Новичок в MySQL, так что терпите меня.

7 ответов

Решение

На самом деле, ваш первый SELECT оператор не создал столбец в таблице:

SELECT *, (High - Low) as DiffHL FROM exdata3;

Вместо этого он создал "виртуальный" столбец, доступный только в его наборе результатов.

Вы должны добавить столбец вручную или переписать свой SELECT в качестве таких:

SELECT *, (High - Low) as DiffHL FROM exdata3 WHERE (High - Low) > 100;

Если вы действительно хотите добавить столбец DiffHL к таблице вы можете попробовать добавить столбец со следующими утверждениями:

ALTER TABLE exdata3 ADD COLUMN DiffHL INT NULL;
-- Create an empty DiffHL column

UPDATE exdata3 SET DiffHL = High - Low;
-- Fill DiffHL column with values

SELECT * FROM exdata3;
-- Here DiffHL column is actually exists

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

Вы можете ссылаться на выражение по псевдониму в HAVING пункт.

Например, это будет правильно:

SELECT t.*
     , (t.High - t.Low) AS DiffHL
  FROM exdata3 t
HAVING DiffHL > 100
^^^^^^

в WHERE предложение, вам нужно будет повторить выражение. Например, это будет правильно:

SELECT t.*
     , (t.High - t.Low) AS DiffHL
  FROM exdata3 t
 WHERE (t.High - t.Low) > 100 
       ^^^^^^^^^^^^^^^^

Вы что-то не так понялиDiffHL это просто имя вашего поля в вашем наборе результатов. MySQL не создает поле, он просто называет столбец в вашем наборе результатов.

select * , (High - Low) as DiffHL from exdata3

В приведенном выше запросе вы используете псевдоним (High - Low) для DiffHL, он не добавит новый столбец в вашу существующую таблицу.

Попробуйте ниже правильный запрос:

select * , (High - Low) as DiffHL from exdata3 where DiffHL >100

Столбец не существует в вашей таблице.

select * , (High - Low) as DiffHL from exdata3;

Этот запрос только создает псевдоним для столбца (High - Low)

использование

select * from exdata3 where (High - Low) >100 

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

select * from exdata3 where DiffHL >100 

в

select * from exdata3 where (High - Low) > 100

MySql только временно добавил этот столбец для отображения с этим запросом

Другие вопросы по тегам