Onbekende kolom in Where-clausule

Ik heb een eenvoudige vraag:

SELECT u_name AS user_name FROM users WHERE user_name = "john";

Ik krijg Unknown Column 'user_name' in where clause. Kan ik niet verwijzen naar 'user_name'in andere delen van de verklaring, zelfs niet nadat select 'u_name as user_name'heeft geselecteerd?


Antwoord 1, autoriteit 100%

SQL wordt achterstevoren geëvalueerd, van rechts naar links. Dus de where-clausule wordt geparseerd en geëvalueerd voorafgaand aan de select-clausule. Hierdoor heeft de aliasing van u_name naar gebruikersnaam nog niet plaatsgevonden.


Antwoord 2, autoriteit 53%

Hoe zit het met:

SELECT u_name AS user_name FROM users HAVING user_name = "john";

Antwoord 3, autoriteit 38%

Zie de volgende MySQL-handleiding: http://dev.mysql .com/doc/refman/5.0/en/select.html

“Een select_expr kan een alias krijgen
met behulp van AS alias_name. De alias wordt gebruikt
als de kolomnaam van de uitdrukking en
kan worden gebruikt in GROUP BY, ORDER BY of
clausules HEBBEN.”

(…)

Het is niet toegestaan om te verwijzen naar een kolomalias in een WHERE-clausule,
omdat de kolomwaarde mogelijk nog niet is bepaald wanneer de WHERE
clausule wordt uitgevoerd. Zie Paragraaf B.5.4.4, “Problemen met Kolom
Aliassen”.


Antwoord 4, autoriteit 12%

select u_name as user_name from users where u_name = "john";

Zie het als volgt, uw waar-clausule evalueert eerst, om te bepalen welke rijen (of samengevoegde rijen) moeten worden geretourneerd. Zodra de where-clausule is uitgevoerd, wordt de select-clausule ervoor uitgevoerd.

Om het beter te zeggen, stel je dit voor:

select distinct(u_name) as user_name from users where u_name = "john";

Je kunt niet naar de eerste helft verwijzen zonder de tweede. Waar wordt altijd eerst geëvalueerd, dan de select-clausule.


Antwoord 5, autoriteit 11%

Als u een query probeert uit te voeren zoals de volgende (zoek alle knooppunten met ten minste één bijlage) waarbij u een SELECT-instructie hebt gebruikt om een nieuw veld aan te maken dat niet echt in de database bestaat, en probeer de alias voor dat resultaat te gebruiken, je zult hetzelfde probleem tegenkomen:

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
WHERE attachments.nodeid = nodes.id) AS attachmentcount 
FROM nodes
WHERE attachmentcount > 0;

Je krijgt een foutmelding “Onbekende kolom ‘attachmentcount’ in WHERE-clausule”.

De oplossing is eigenlijk vrij eenvoudig – vervang gewoon de alias door de instructie die de alias produceert, bijvoorbeeld:

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;

Je krijgt nog steeds de alias terug, maar nu zou SQL niet meer naar de onbekende alias moeten gaan.


Antwoord 6, autoriteit 9%

Uw gedefinieerde aliaswordt niet verwelkomd door de WHERE-clausule. U moet hiervoor de HAVING-clausule gebruiken

SELECT u_name AS user_name FROM users HAVING user_name = "john";

OF je kunt de originele kolomnaam direct gebruiken met de WHERE

SELECT u_name AS user_name FROM users WHERE u_name = "john";

Hetzelfde als dat je het resultaat hebt in een door de gebruiker gedefinieerde alias als resultaat van een subquery of een berekening, zal het worden benaderd door de HAVING-clausule en niet door de 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'

Antwoord 7, autoriteit 7%

Ofwel:

SELECT u_name AS user_name
FROM   users
WHERE  u_name = "john";

of:

SELECT user_name
from
(
SELECT u_name AS user_name
FROM   users
)
WHERE  u_name = "john";

De laatste zou hetzelfde moeten zijn als de eerste als het RDBMS predikaat ondersteunt om naar de in-line weergave te duwen.


Antwoord 8, autoriteit 6%

gecorrigeerd:

SELECT u_name AS user_name FROM users WHERE u_name = 'john';

Antwoord 9, autoriteit 5%

Nee, je moet het met de juiste naam selecteren. Als je de tabel die je selecteert een alias hebt gegeven, kun je die wel gebruiken.


Antwoord 10, autoriteit 2%

Nee, dat kan niet. user_name is bestaat pas na terugkeertijd.


Antwoord 11

Onbekende kolom in WHERE-clausule veroorzaakt door regel 1 en 2 en opgelost door regel 3:

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

Antwoord 12

Misschien helpt het.

Je kunt

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

Het werkt.

MAAR ZORG ERVOOR WAT JE DOET!

  • Indexen worden hier NIET GEBRUIKT
  • Er wordt een VOLLEDIGE TABLE gescand – u heeft het LIMIT 1-gedeelte niet gespecificeerd
  • Dus, – DEZE QUERY WORDT SLLLOOOOOOW op enorme tafels.

Maar misschien helpt het in sommige gevallen


Antwoord 13

Hoewel u uw tabellen in uw zoekopdracht kunt aliassen (d.w.z. “SELECT u.gebruikersnaam FROM gebruikers u;”), moet u de werkelijke namen gebruiken van de kolommen waarnaar u verwijst. AS heeft alleen invloed op hoe de velden worden geretourneerd.


Antwoord 14

SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"

Antwoord 15

Ik had net dit probleem.

Zorg ervoor dat er geen spatie is in de naam van de entiteit in de database.

bijv. ‘ gebruikersnaam’ in plaats van ‘gebruikersnaam’


Antwoord 16

probeer uw taak met de voorwaarde INof OFen ook deze zoekopdracht werkt op spark-1.6.x

SELECT  patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');

of

SELECT  patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';

Antwoord 17

Voor mij was de oorzaak van het probleem een getal dat ik kopieerde om te gebruiken in een WHERE-clausule. Het nummer had een “onzichtbaar” symbool, althans voor MySQL Workbench. Ik plaatste het nummer in de Chrome-console, het was duidelijk zichtbaar.


Antwoord 18

Ik had hetzelfde probleem, ik vond dit nuttig.

mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");

vergeet niet $user tussen ‘ ‘ enkele aanhalingstekens te zetten.

Other episodes