sql >> Database teknologi >  >> RDS >> Mysql

Hvorfor er brug af kolonnealias i same select ikke understøttet i Oracle og Mysql?

Et alias kan bruges i en forespørgselsvalgsliste for at give en kolonne et andet navn. Du kan bruge aliaset i GROUP BY , ORDER BY , eller HAVING klausuler for at henvise til kolonnen:

SELECT SQRT(a*b) AS root FROM tbl_name
  GROUP BY root HAVING root > 0;

SELECT id, COUNT(*) AS cnt FROM tbl_name
  GROUP BY id HAVING cnt > 0;

SELECT id AS 'Customer identity' FROM tbl_name;

Standard SQL tillader ikke referencer til kolonnealiasser i en WHERE klausul. Denne begrænsning er pålagt, fordi når WHERE klausulen evalueres, er kolonneværdien muligvis ikke bestemt endnu. For eksempel er følgende forespørgsel ulovlig:

SELECT id, COUNT(*) AS cnt FROM tbl_name
  WHERE cnt > 0 GROUP BY id;

WHERE klausul bestemmer, hvilke rækker der skal inkluderes i GROUP BY klausul, men det refererer til alias for en kolonneværdi, der ikke er kendt før efter rækkerne er blevet valgt og grupperet efter GROUP BY .

På valglisten for en forespørgsel kan et citeret kolonnealias angives ved hjælp af identifikator eller strenge, der citerer tegn:

SELECT 1 AS `one`, 2 AS 'two';

Andre steder i sætningen skal citerede referencer til aliasset bruge identifikator-citering, ellers behandles referencen som en bogstavelig streng. For eksempel grupperer denne sætning efter værdierne i kolonne-id, der refereres til ved hjælp af aliasset a :

SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY `a`;

Men denne sætning grupperer efter den bogstavelige streng 'a' og vil ikke fungere som forventet:

SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY 'a';

Kilde:https://docs.oracle .com/cd/E17952_01/refman-5.0-en/problems-with-alias.html



  1. Enhver måde at *ikke* bruge server-side forberedte erklæringer i Postgresql?

  2. Hvordan gemmer jeg JS Date.now() i PostgreSQL?

  3. Hvad er den bedste måde at få adgang til en database fra PHP?

  4. Oracle TNS:Nettjenestenavnet er forkert angivet