簡體   English   中英

Where 子句中的未知列

[英]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子句中的未知列:

  1. $sql = "SELECT * FROM users WHERE username =".$userName;
  2. $sql = "SELECT * FROM users WHERE username =".$userName."";
  3. $sql = "SELECT * FROM users WHERE username ='".$userName."'";

可能會有所幫助。

你可以

SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";

有用。

但要確保你做什么!

  • 此處不使用索引
  • 將掃描 FULL TABLE - 您尚未指定 LIMIT 1 部分
  • 所以, - 這個查詢在大桌子上會很慢。

但是,在某些情況下可能會有所幫助

雖然您可以在您的查詢中為您的表命名(即“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM