[英]Unknown Column In Where Clause
我有一個簡單的查詢:
SELECT u_name AS user_name FROM users WHERE user_name = "john";
我Unknown Column 'user_name' in where clause
得到了Unknown Column 'user_name' in where clause
。 即使在select 'u_name as user_name'
之后,我也不能在語句的其他部分引用'user_name'
select 'u_name as user_name'
嗎?
SQL 從右到左向后求值。 所以 where 子句在 select 子句之前被解析和評估。 因此,尚未發生 u_name 到 user_name 的別名。
關於什么:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
請參閱以下 MySQL 手冊頁: http : //dev.mysql.com/doc/refman/5.0/en/select.html
“可以使用 AS alias_name 為 select_expr 指定一個別名。別名用作表達式的列名,並且可以在 GROUP BY、ORDER BY 或 HAVING 子句中使用。”
(……)
不允許在 WHERE 子句中引用列別名,因為在執行 WHERE 子句時可能尚未確定列值。 請參見第 B.5.4.4 節“列別名問題”。
select u_name as user_name from users where u_name = "john";
可以這樣想,您的 where 子句首先評估,以確定需要返回哪些行(或連接的行)。 一旦 where 子句被執行,select 子句就會為它運行。
換一種更好的方式,想象一下:
select distinct(u_name) as user_name from users where u_name = "john";
如果沒有第二部分,您就無法參考前半部分。 哪里總是先求值,然后是 select 子句。
如果您嘗試執行如下查詢(找到所有節點,至少有一個附件),您使用 SELECT 語句創建了一個實際上不存在於數據庫中的新字段,並嘗試使用該結果的別名你會遇到同樣的問題:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
您將收到錯誤“WHERE 子句中的未知列‘attachmentcount’”。
解決方案實際上相當簡單——只需用產生別名的語句替換別名,例如:
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;
您仍然會返回別名,但現在 SQL 不應該在未知別名處出錯。
WHERE
子句不歡迎您定義的alias
,您必須為此使用HAVING
子句
SELECT u_name AS user_name FROM users HAVING user_name = "john";
或者您可以直接使用原始列名和WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
與作為子查詢或任何計算的結果在用戶定義別名中的結果相同,它將由HAVING
子句而不是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'
任何一個:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
要么:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
如果 RDBMS 支持將謂詞推入內聯視圖,則后者應該與前者相同。
更正:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
不,您需要使用正確的名稱選擇它。 如果您提供了從別名中選擇的表格,則可以使用它。
你不能。 user_name 直到返回時間才存在。
由第 1 行和第 2 行引起並由第 3 行解決的WHERE
子句中的未知列:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
可能會有所幫助。
你可以
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
有用。
但要確保你做什么!
但是,在某些情況下可能會有所幫助
雖然您可以在您的查詢中為您的表命名(即“SELECT u.username FROM users u;”),但您必須使用您所引用的列的實際名稱。 AS 僅影響字段的返回方式。
據我所知,在MS-SQL 2000/5中。 過去我對此一直犯規。
剛遇到這個問題。
確保數據庫中實體的名稱中沒有空格。
例如“user_name”而不是“user_name”
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
使用IN條件或OR條件嘗試您的任務,此查詢也在 spark-1.6.x 上運行
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
要么
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
對我來說,問題的根源是我復制到 WHERE 子句中使用的一個數字。 該數字具有“隱形”符號,至少對於 MySQL Workbench 而言是這樣。 我將數字放在 Chrome 控制台中,它清晰可見。
我有同樣的問題,我發現這很有用。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
記住將 $user 放在 ' ' 單引號中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.