Как реализовать sql поиск по нескольким полям с учётом того, что запрос может содержать сразу два поля?

Как реализовать sql поиск по нескольким полям?Пример работает не корректно
select id,name,surname from users WHERE name LIKE '%Роман%' OR surname LIKE '%Роман%'

Сейчас идёт поиск и ищем значение "Роман" по двум полям. Точно так же запрос "Ракзин" выводит фамилию....
но если ввести "Ракзин Роман", то так как поля нет- естественно ничего не выводится. Мне нужно сделать запрос, что данный вариант работал. Как такое реализовать?
  • Вопрос задан
  • 6158 просмотров
Пригласить эксперта
Ответы на вопрос 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
SELECT ID, Name + ' ' + Surname AS LikeName FROM Users WHERE LikeName = 'Ракзин Роман'

Если вы хотите всех 'Роман' и всех 'Ракзин'
SELECT ID, Name + ' ' + Surname AS LikeName FROM Users 
WHERE (LikeName LIKE '%Ракзин%') OR  (LikeName LIKE '%Роман%')

Реальный поиск фильмов, их атрибутов и персон.
Представление для поиска
CREATE VIEW SearchLike
AS
  SELECT Film.ID, 
         ISNULL(CAST(Film.Year AS VARCHAR) + ' ', '') + ISNULL(Head.Name + ' ' + Film.HeadingNumber + ' ', '') 
           + ISNULL(Film.Article + ' ', '') + ISNULL(Film.Name + ' ', '') + ISNULL(Film.NameTranslat + ' ', '') 
           + ISNULL(Film.Addition + ' ', '') + ISNULL(Film.Country + ' ', '') 
           + ISNULL(FilmAttributeGroup.Name + ' ', '') + ISNULL(FilmAttributeValue.Value + ' ', '') AS Search,
         Film.[Key]
    FROM FilmAttributeValue 
      INNER JOIN FilmAttribute ON FilmAttributeValue.ID = FilmAttribute.Attribute 
      INNER JOIN FilmAttributeGroup ON FilmAttributeValue.[Group] = FilmAttributeGroup.ID 
      RIGHT OUTER JOIN Film ON FilmAttribute.Film = Film.ID 
      LEFT OUTER JOIN Film AS Head ON Film.Heading = Head.ID
  --
  UNION
  --
  SELECT Person, 
         [Name], 
         'P' + CAST(Person AS VARCHAR)
    FROM PersonNameFormat
    WHERE ([Format] > 10) OR ([Format] = 0)
--
GO

Представление для наименования
CREATE VIEW SearchName
AS
  -- Фильмы:
  SELECT Film.ID, 
         FilmNamePower.[Year]     AS [Year], 
         FilmNamePower.NameCommon AS [Name], 
         Film.WatchDisplay,
         Film.Icon,
         Film.AttributeIcon,
         '0' + Film.[Range] AS [Range],
         Film.[Key],
         Film.ID AS UnitID
    FROM Film INNER JOIN FilmNamePower ON Film.ID = FilmNamePower.ID
  --
  UNION
  -- Персоны:
  SELECT ID, 
         ISNULL(YEAR(BirthDay), 1900), 
         NameFull, 
         '', 
         NoteIcon, 
         NULL, 
         '1' + CONVERT(VARCHAR, ISNULL(BirthDay, '19000101'), 112) + [Range], 
         [Key],
         -1
    FROM Person    
--
GO

Грид, поиск до трёх параметров
CREATE PROCEDURE SearchGrid @P1 VARCHAR(100) = NULL, @P2 VARCHAR(100) = NULL, @P3 VARCHAR(100) = NULL
AS
  SELECT DISTINCT
         SearchName.ID, 
         SearchName.[Year], 
         SearchName.[Name], 
         SearchName.WatchDisplay, 
         SearchName.Icon,
         SearchName.AttributeIcon,
         SearchName.[Range],
         LEFT(SearchName.[Key], 1) AS Kind,
         SearchName.UnitID
    FROM SearchName INNER JOIN SearchLike ON SearchName.[Key] = SearchLike.[Key]
    WHERE ((NOT @P1 IS NULL) AND (SearchLike.Search LIKE '%' + @P1 + '%'))
       OR ((NOT @P2 IS NULL) AND (SearchLike.Search LIKE '%' + @P2 + '%')) 
       OR ((NOT @P3 IS NULL) AND (SearchLike.Search LIKE '%' + @P3 + '%')) 
    ORDER BY SearchName.[Range]
--
GO

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы