SQL объединяет строки? - PullRequest
2 голосов
/ 22 апреля 2009

У меня есть запрос, который принимает входные данные от конечного пользователя и сравнивает его с двумя столбцами по отдельности, а два столбца объединяются.

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

Извините за массивный синтаксис, но я уверяю вас, это правильно в программе.

Он написан на PHP, запрашивает базу данных SQL SERVER 2005 и не учитывает регистр.

Ввод одного имени (имя или фамилия) вернет правильные результаты, но ввод сначала, затем пробел, затем последний возвращает пустой набор.

Есть идеи?

Ответы [ 8 ]

11 голосов
/ 22 апреля 2009

потому что 'полное_имя' является литералом, а не именем столбца, оно не существует на уровне предложения WHERE

нужно добавить

OR f_name + ' ' + l_name = user-input

вместо ИЛИ 'full_name' = пользовательский ввод

5 голосов
/ 22 апреля 2009

В соответствии с теорией "научить человека ловить рыбу" ...

Нельзя использовать псевдоним столбца в предложении where или group by. Вы можете использовать его в порядке заказа. Чтобы использовать псевдоним столбца так, как вы хотите, вам нужно сделать что-то вроде ...

SELECT [Full Name] FROM
  (SELECT f_name, l_name, f_name + ' ' + l_name AS [Full Name]
   FROM users_table)
  WHERE [Full_Name] = @paramVal
2 голосов
/ 22 апреля 2009

попробовать:

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
2 голосов
/ 22 апреля 2009

'full_name' является литеральной строкой, а не столбцом ...

(f_name + '' + l_name) = пользовательский ввод

1 голос
/ 22 апреля 2009

Это будет работать:

SELECT *
FROM users_table
WHERE CONCAT(first_name,' ',last_name) = user-input;
1 голос
/ 22 апреля 2009

Проблема в этой строке:

OR 'full_name' = user-input

Если это действительно то, что вы записали, вы сравниваете буквенную строку "полное_имя" с предоставленным вводом. Помещение одинарных кавычек вокруг чего-либо рассматривает это как литерал. Попробуйте следующее:

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
1 голос
/ 22 апреля 2009

Для начала удалите одинарные кавычки вокруг полного имени в последнем критерии где. Теперь пользовательский ввод сравнивается со строковым литералом 'full_name'.

Часть конкатенации должна быть в порядке!

0 голосов
/ 14 сентября 2010

Убедитесь, что пользователь вводит "full_name" (без кавычек) в качестве пользовательского ввода, и база данных возвращает несколько строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...