Как найти данные в SQL Server с неправильным пробелом в середине? - PullRequest
0 голосов
/ 08 июля 2019

Я хотел найти кого-то в моей базе данных (мое приложение было разработано на C #, а база данных - Microsoft SQL Server 2008).

Пользователь хочет найти это имя "Джон Алан":

  • Сценарий 1: пользователь ввел "Джон Алан", все в порядке, я могу найти его с моим ИП по базе данных

  • Сценарий 2: пользователь ввел "johnalan", без пробела между именем и семьей

  • Сценарий 3: пользователь ввел «Джо Налан» в неправильном месте

У меня нет проблем со сценарием, но как справиться с номерами 2 и 3?

Я провел какой-то поиск в Интернете, но не знал, что именно мне нужно искать. Если это Техника, алгоритм или тип запроса T-SQL или кода C #, пожалуйста, дайте мне имя или помогите мне.

Моя таблица состоит из двух столбцов:

Name       Family
-------   -------
john       alan

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Вы можете сделать это, удалив пробелы из имени и семьи.T-SQL Replace удалит определенные пробелы из вашей строки. Если пользователь использует N пробелов, решение «Заменить» завершится неудачно.Так что вы можете использовать следующий код

  select   '"' + Concat(name,family) + '"', '"' + replace(Concat(name,family), ' ', '') + '"' AS nameandfamily 

Для более подробной информации, пожалуйста, проверьте ссылку

1 голос
/ 08 июля 2019
  1. Я бы предложил вам удалить пробелы в имени в C #.

     Regex.Replace(strFullName, @"\s+", "")
    
  2. Измените таблицу, добавив дополнительный сохраняемый вычисляемый столбец, чтобы иметь значение HASH полного имени, как показано ниже

CREATE TABLE #family(name varchar(10), family varchar(20))

    INSERT INTO #family 
    values ('john','alan'), ('johnalan',''),('joh','nalan')

    ALTER TABLE #family
    ADD FullNamehash AS CHECKSUM(concat(LTRIM(RTRIM(name)), LTRIM(RTRIM(family))))  PERSISTED
  1. Напишите хранимую процедуру, которая принимает fullName в качестве параметра, который возвращает сведения о семействе, как указано ниже. Вы можете прочитать больше о CHECKSUM
CREATE PROCEDURE ReturnFamilyDetails (@fullName VARCHAR(30))
    AS
    BEGIN
    DECLARE @hash_fullname int = CHECKSUM(@fullName)
    SELECT name,family from #family where fullNamehash = @hash_fullname
    END
0 голосов
/ 08 июля 2019

Если вы хотите искать только этот простой сценарий Вы можете объединить 2 столбца и использовать LIKE для составного пользовательского запроса

userquery = Regex.Replace(userquery, @"\s+", "").ToLower();
..
where Regex.Replace(query.Name+query.Family, @"\s+", "").ToLower() LIKE userquery
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...