2009-04-22 6 views
2

J'ai une requête qui prend l'entrée de l'utilisateur final et la compare à 2 colonnes individuellement, et les deux colonnes concaténées. Excuse la syntaxe massive échouer, mais je vous assure qu'il est correct dans le programme.Chaînes de concaténation SQL?

Il est écrit en PHP, interrogeant une base de données SQL SERVER 2005, et est insensible à la casse. Si vous tapez un nom (premier ou dernier), vous obtiendrez des résultats corrects, mais en tapant d'abord, puis en espaçant, puis en dernier, vous obtiendrez un ensemble vide.

Des idées?

+0

Upvotes pour tout le monde parce que vous êtes bien ... –

Répondre

11

qui est parce que « full_name » est un littéral et non un nom de colonne, il n'existe pas au WHERE niveau de la clause

vous devez ajouter

OR f_name + ' ' + l_name = user-input 

au lieu de OR « full_name » = user-input

+0

SQL lancerait une erreur "Invalid Column Name" si j'essayais d'utiliser full_name sans le '' ... –

+0

car il n'existe pas dans la table – SQLMenace

1

Pour commencer, supprimez les guillemets simples autour du nom complet dans les derniers critères. Maintenant, l'entrée de l'utilisateur est comparée à la chaîne littérale 'full_name'.

La partie de concaténation devrait être a-ok!

+0

SQL lancerait une erreur "Invalid Column Name" si j'essayais d'utiliser full_name sans le '' ... –

2

'full_name' est une chaîne de caractères non la colonne ...

(f_name + '' + L_Name) =-entrée utilisateur

1

Le problème se trouve dans cette ligne:

OR 'full_name' = user-input 

Pourvu que ce soit réellement ce que vous avez écrit, vous comparez la chaîne littérale "full_name" à l'entrée fournie. Mettre des guillemets simples autour de quelque chose le traite comme un littéral. Effectuez les opérations suivantes:

SELECT f_name, l_name, (f_name + ' ' + l_name) AS full_name 
FROM users_table 
    WHERE f_name = user-input 
    OR l_name = user-input 
    OR full_name = user-input 
2

essayer:

SELECT f_name, 
     l_name, 
     (f_name + ' ' + l_name) AS full_name 
FROM users_table 
WHERE f_name = user-input 
    OR l_name = user-input 
    OR f_name + ' ' + l_name = user-input 
5

Selon la théorie « enseigner un homme à pêcher » ...

Vous ne pouvez pas utiliser un alias de colonne dans un endroit ou un groupe par l'article . Vous pouvez l'utiliser dans une clause order by. Pour utiliser un alias de colonne comme vous voulez, vous devez faire quelque chose comme ...

SELECT [Full Name] FROM 
    (SELECT f_name, l_name, f_name + ' ' + l_name AS [Full Name] 
    FROM users_table) 
    WHERE [Full_Name] = @paramVal 
+0

Quel est le point d'un alias alors? Geesh. –

+0

Je vous entends, mais je suis loin d'être qualifié pour parler des décisions internes de conception de SQL Server. :) –

1

Cela fonctionne:

SELECT * 
FROM users_table 
WHERE CONCAT(first_name,' ',last_name) = user-input; 
0

Assurez-vous que l'utilisateur entre « full_name » (sans les guillemets) comme l'entrée de l'utilisateur et la base de données retournera certaines lignes.

Questions connexes