Как функция в SQL Server 2008 требуется предложение


У меня есть таблица Customer с 2 столбцами Name и Name (sql Server 2008). Пользователь хочет искать по имени-фамилии-или просто набрав Jo Bloggs. Предположим, что строка заполнена

CustomerId        Name    Surname
1                 Jo      Bloggs

Делать

select * from customer where Name like '%Jo%'             will find the records
select * from customer where Surname like '%Bloggs%'      will find the records

Но как я могу заставить его возвращать записи, если пользователь вводит имя и фамилию, например Jo Bloggs?

4   3   2010-07-21 16:16:35

4 ответа:

Это должно работать независимо от того, вводит ли пользователь имя, фамилию или и то, и другое.

SELECT *
FROM customer cus
WHERE ((cus.Name like @FirstName) OR (@FirstName IS NULL)) AND
      ((cus.Surname like @Surname) OR (@Surname IS NULL))

Я использовал две переменные, потому что ввод входных значений в строку SQL сильно не рекомендуется, так как это подвергает SQL-инъекции (кроме того, что медленнее).

Вы также можете создать вычисляемый столбец и выполнить поиск по нему:

ALTER TABLE dbo.customer
   ADD FullName as Name + ' ' + Surname PERSISTED

Теперь у вас будет дополнительный столбец FullName в вашей таблице customer, которая всегда актуальна, и вы можете искать:

SELECT (list of fields) FROM dbo.customer 
  WHERE Fullname = 'Jo Bloggs'

И поскольку это сохраняемый вычисляемый столбец, вы даже можете поместить на него индекс, чтобы ускорить точный поиск

select * from customer where Name like '%Jo%' and Surname like '%Bloggs%'   
select * from customer where Name like '%Jo%'             
union
select * from customer where Surname like '%Bloggs%'