2010-04-30 6 views
0

j'ai lu que, après sélection, nous utilisons les noms de colonnes, mais j'ai trouvé une déclaration qui ressemblait à ceci:noms de colonnes MySQL et alias

SELECT 'A' FROM T WHERE A = NULL; 

-vous louer me aider? merci (A est un nom ici par colonnes?) mon SGBD MySQL est

ÉDITÉ: la question exacte est-ce que: Est-ce que l'énoncé ci-dessus produire une ligne (sélectionnez tout ce qui appliquent)? Notez que ANSI_NULLS est désactivé.

Je veux savoir que la déclaration ci-dessus va fonctionner? parce que certains d'entre vous a dit que nous devrions écrire IS NULL au lieu de = null

+1

Quelle base de données (MySQL, MSSQL, Oracle ..)? Et quelle est exactement la question? – Blorgbeard

+0

Il serait utile que vous puissiez publier ce que votre schéma de base de données est et ce que vous essayez d'obtenir à la suite de votre requête. –

+0

Qu'essayez-vous de faire avec cette déclaration? Cela n'a pas l'air très utile pour le moment .. – Blorgbeard

Répondre

8

Sur la base de cette requête, vous obtiendrez un jeu de résultats contenant le caractère « A » pour chaque ligne où la colonne nommée A était égale à null.

Si vous voulez vraiment voir la valeur de la colonne A au lieu du caractère « A », vous devez supprimer les guillemets simples:

SELECT A FROM T WHERE A IS NULL 

Quoi qu'il en soit, vous ne devriez pas utiliser = NULL. Certains RDMS ne traitent pas cela comme vous le penseriez. La norme est d'utiliser IS NULL à la place.

+0

merci pour votre belle réponse. – user329820

4

Vous devez utiliser

SELECT 'A' FROM T WHERE A IS NULL; 
+1

C'est parce que SQL est tristement célèbre pour avoir des problèmes avec '= null' et produire des résultats inattendus lorsqu'il est utilisé de cette façon. Le 'IS NULL' fonctionnera correctement. –

+9

@ rb.usa, Ce n'est pas "tristement célèbre pour avoir des problèmes avec = null", c'est tristement célèbre pour que les développeurs ne comprennent pas que NULL N'EST PAS UNE VALEUR, ET VOUS NE POUVEZ PAS L'UTILISER COMME UN. –

1

Votre instruction SELECT a la signification suivante:

« Pour chaque ligne de la table appelée T, retourner la chaîne « A » si la colonne A de la table T est NULL »

Donc, si vous avez 3 enregistrements où A est NULL, la sortie sera:

A 
A 
A 
3 row(s) selected 

la syntaxe correcte est où A est NULL, et non A = NULL.

1

Avez-vous essayé de l'exécuter sur votre base de données de test pour voir ce qu'il fait? Ou était-ce juste en lisant?

Briser cette déclaration, ce qui est dit est:

Dans le tableau T (de T), trouver les lignes où la valeur de A est nulle (où A = NULL).

Pour chacune de ces lignes, renvoyez un 'A'.

Le résultat j'attendre est

+--+ 
|T | 
+--+ 
|A | 
|A | 
... 
|A | 
+--+ 

Si la déclaration était à la place:

SELECT A FROM T WHERE A = NULL; 

Lorsque les guillemets simples sont supprimés, il retournerait un tas de valeurs nulles, la valeur de la colonne A.

1

A est un nom de colonne, mais vous ne souhaitez probablement pas utiliser de guillemets simples. Je vais essayer ...

SELECT A FROM T WHERE A IS NULL; 
+1

Cela dépend si l'auteur d'origine voulait la valeur de A ou le caractère littéral 'A'. – justkt

+0

La valeur de A sera toujours nulle étant donné la clause where .. c'est une requête très étrange, dans l'ensemble. – Blorgbeard

2

Il existe trois types de guillemets dans SQL.

  • La citation simple ' signifie que quelque chose est un littéral de chaîne. 'A' dans ce cas signifie qu'il renvoie le caractère A pour toutes les lignes où la colonne A est NULL.
  • La double citation " signifie que quelque chose est un identifiant. Ceci est utile si l'identificateur a le même nom qu'un mot réservé, par exemple select. Exemple: SELECT "select" FROM T sélectionne la colonne select à partir de la table T.
  • Le guillemet ` ne fonctionne que dans MySQL, et est le même que le guillemet. La double citation peut parfois être utilisée pour les littéraux de chaîne dans MySQL, bien que cela soit très contraire à la norme. MySQL a une option pour se conformer à la norme, en utilisant SET SQL_MODE='ANSI'; où le backtick devient invalide, et vous devez utiliser les guillemets simples et doubles à la place.

Un identificateur sans guillemets est identique à un identificateur entre guillemets, sauf s'il s'agit d'un mot réservé.

Espérons que cela aide à comprendre un peu plus.

2

En réponse à votre question:

A = NULL est toujours faux, alors vous obtiendrez aucune ligne retournée. Pour comparer avec NULL, vous devez utiliser A is NULL à la place.

NULL est spécial dans SQL, en ce qu'il n'est égal à rien, même lui-même. Oui, (NULL = NULL) est évalué à false.

Si vous le modifiez à IS NULL, vous obtiendrez un ensemble de lignes avec une colonne, contenant le caractère «A» dans chaque ligne. Vous obtiendrez un 'A' pour chaque ligne de la table T où la colonne A est nulle.

Vous obtiendrez la lettre A et non la valeur de la colonne car vous avez des guillemets autour du 'A'. Si vous les supprimez, vous aurez la valeur de A dans chaque ligne (qui sera nulle, car ce sont les lignes que vous sélectionnez avec votre clause where).

Si vous vouliez voir les lignes en T a une valeur nulle pour A, alors vous devriez changer pour select * from T where A is null

Questions connexes