可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a simple query:
SELECT u_name AS user_name FROM users WHERE user_name = \"john\";
I get Unknown Column \'user_name\' in where clause
. Can I not refer to \'user_name\'
in other parts of the statement even after select \'u_name as user_name\'
?
回答1:
SQL is evaluated backwards, from right to left. So the where clause is parsed and evaluate prior to the select clause. Because of this the aliasing of u_name to user_name has not yet occurred.
回答2:
See the following MySQL manual page: http://dev.mysql.com/doc/refman/5.0/en/select.html
\"A select_expr can be given an alias
using AS alias_name. The alias is used
as the expression\'s column name and
can be used in GROUP BY, ORDER BY, or
HAVING clauses.\"
(...)
It is not permissible to refer to a column alias in a WHERE clause,
because the column value might not yet be determined when the WHERE
clause is executed. See Section B.5.4.4, “Problems with Column
Aliases”.
回答3:
What about:
SELECT u_name AS user_name FROM users HAVING user_name = \"john\";
回答4:
select u_name as user_name from users where u_name = \"john\";
Think of it like this, your where clause evaluates first, to determine which rows (or joined rows) need to be returned. Once the where clause is executed, the select clause runs for it.
To put it a better way, imagine this:
select distinct(u_name) as user_name from users where u_name = \"john\";
You can\'t reference the first half without the second. Where always gets evaluated first, then the select clause.
回答5:
If you\'re trying to perform a query like the following (find all the nodes with at least one attachment) where you\'ve used a SELECT statement to create a new field which doesn\'t actually exist in the database, and try to use the alias for that result you\'ll run into the same problem:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
You\'ll get an error \"Unknown column \'attachmentcount\' in WHERE clause\".
Solution is actually fairly simple - just replace the alias with the statement which produces the alias, eg:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;
You\'ll still get the alias returned, but now SQL shouldn\'t bork at the unknown alias.
回答6:
Either:
SELECT u_name AS user_name
FROM users
WHERE u_name = \"john\";
or:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = \"john\";
The latter ought to be the same as the former if the RDBMS supports predicate pushing into the in-line view.
回答7:
Your defined alias
are not welcomed by the WHERE
clause you have to use the HAVING
clause for this
SELECT u_name AS user_name FROM users HAVING user_name = \"john\";
OR you can directly use the original column name with the WHERE
SELECT u_name AS user_name FROM users WHERE u_name = \"john\";
Same as you have the result in user defined alias as a result of subquery or any calculation it will be accessed by the HAVING
clause not by the WHERE
SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users WHERE u_name = \"john\" HAVING user_last_name =\'smith\'
回答8:
No you need to select it with correct name. If you gave the table you select from an alias you can use that though.
回答9:
corrected:
SELECT u_name AS user_name FROM users WHERE u_name = \'john\';
回答10:
No you cannot. user_name is doesn\'t exist until return time.
回答11:
Unknown column in WHERE
clause caused by lines 1 and 2 and resolved by line 3:
$sql = \"SELECT * FROM users WHERE username =\".$userName;
$sql = \"SELECT * FROM users WHERE username =\".$userName.\"\";
$sql = \"SELECT * FROM users WHERE username =\'\".$userName.\"\'\";
回答12:
May be it helps.
You can
SET @somevar := \'\';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = \"john\";
It works.
BUT MAKE SURE WHAT YOU DO!
- Indexes are NOT USED here
- There will be scanned FULL TABLE - you hasn\'t specified the LIMIT 1 part
- So, - THIS QUERY WILL BE SLLLOOOOOOW on huge tables.
But, may be it helps in some cases
回答13:
I had the same problem, I found this useful.
mysql_query(\"SELECT * FROM `users` WHERE `user_name`=\'$user\'\");
remember to put $user in \' \' single quotes.
回答14:
Just had this problem.
Make sure there is no space in the name of the entity in the database.
e.g. \' user_name\' instead of \'user_name\'
回答15:
While you can alias your tables within your query (i.e., \"SELECT u.username FROM users u;\"), you have to use the actual names of the columns you\'re referencing. AS only impacts how the fields are returned.
回答16:
Not as far as I know in MS-SQL 2000/5. I\'ve fallen foul of this in the past.
回答17:
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = \"john\"
回答18:
try your task using IN condition or OR condition and also this query is working on spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN (\'User4\', \'User3\');
or
SELECT patient, patient_id FROM `patient` WHERE patient = \'User1\' OR patient = \'User2\';