0
votes

Comment rechercher un nom complet dans la table de base de données SQL Server avec uniquement la colonne FirstName et NomName?

Nous avons une table de dB, utilisateur avec premier_name , last_name colonnes mais ne possède pas de pleine_name colonne. Nous voulons effectuer une recherche sur la table, où la requête de recherche peut contenir la chaîne qui est une combinaison de colonnes ou d'une d'elles ou simplement d'un caractère. La recherche a à étudier insensible.

éditer 1 La recherche doit être suffisamment rapide car la demande proviendrait d'une typesseahead sur un webclient.


5 commentaires

Ajoutez une colonne calculée (persistée) et interrogez-la? Nous n'avons pas beaucoup pour aller ici.


Pourquoi ne pas rechercher les deux colonnes? Avez-vous besoin de numériser n'importe où dans les champs ou juste au début? Seules les recherches préfixes (c.-à-d. comme 'ABC%' ) peuvent tirer parti de l'indexation. Si vous souhaitez des performances rapides, vous devrez activer et utiliser Recherche en texte intégral indexation


La demande provenait d'une typique sur un webclient. Cela signifie-t-il que vous n'avez besoin que d'une recherche préfixe ? où le nom_texte comme @text + '%' ou last_name comme @text + '%' . Si vous indexez premier_name et last_name séparément, la requête devient une plage recherche sur les deux index


La recherche a à la casse insensible. qui dépend de la classement que vous avez utilisé dans la table. Les collations les plus courantes sont insensibles au cas. Vous pouvez vérifier si une assiette est une affaire ou une accentuation sensible de son nom. CI signifie insensible à la casse


Salut Hemant, la réponse a-t-elle travaillé pour vous?


4 Réponses :


0
votes

Une table de dB et un exemple seraient plus faciles à utiliser, mais le cas simple, devrait être quelque chose comme la requête ci-dessous Je vous assurerais que la chaîne de recherche est convertie en minuscules. Notez qu'une telle requête sur une base de données à grande échelle pourrait ne pas être si rapide xxx


1 commentaires

inférieur n'est pas nécessaire sauf si la collation est sensible à la casse. comme '% ..%' devra effectuer une numérisation de table complète de toute façon, car il ne peut pas utiliser aucun index. Concat causera le même problème aussi. Enfin, l'opération similaire ici ne recherche pas recherche de paramètres, juste une chaîne contenant {@ ....} .



1
votes

Le comme code> expressions par défaut est insensible à la casse. Comme @Larnu a suggéré, l'ajout d'une colonne persistante est une meilleure façon d'y aller. Et si vous pouvez effectuer une recherche de préfixe à ce sujet, elle accélérera davantage les choses. Si ce ne sont pas une option, essayez ceci pour voir si vous pouvez tolérer les performances:

SELECT CONCAT_WS (" ", first_name, last_name) full_name
FROM YourTable
WHERE CONCAT_WS (" ", first_name, last_name) LIKE '%some string%';


1 commentaires

Cela obligera une table complète



0
votes

Si vous envisagez le format de votre terme de recherche étant la même chose avec un nom prénom [espace] Nom code> combinaison, vous pouvez faire quelque chose comme ci-dessous:

CREATE TABLE Names
(
    firstname NVARCHAR(100),
    lastname NVARCHAR(100)
)

INSERT INTO Names VALUES
('John', 'Smith'), ('Jane', 'Doe'), ('Harry', 'Potter')


DECLARE @searchname NVARCHAR(100)

--John (Fist Name match only)
SET @searchname = 'John'
SELECT *
FROM Names
WHERE LEFT([Firstname] + ' ' + [lastname], LEN(@searchname)) = @searchname

--Jane D (First name + Initial Last name)
SET @searchname = 'Jane D'
SELECT *
FROM Names
WHERE LEFT([Firstname] + ' ' + [lastname], LEN(@searchname)) = @searchname


--H (Single character only in correct order)
SET @searchname = 'H'
SELECT *
FROM Names
WHERE LEFT([Firstname] + ' ' + [lastname], LEN(@searchname)) = @searchname


0 commentaires

0
votes

Vous pouvez utiliser cette requête:

SELECT first_name,last_name,  CONCAT(first_name,last_name)  full_name  
FROM User_table WHERE CONCAT(fistName,lastName) LIKE '%string%'


1 commentaires

Cela entraînera une analyse de la table complète car elle ne peut pas tirer parti de tout index pour deux raisons - concat crée une valeur qui n'existe pas dans un index et comme '% Leon%% ' recherches dans l'intégralité de l'index, quelque chose qui ne peut pas utiliser d'index normaux