Nous avons une table de dB, utilisateur avec éditer 1
La recherche doit être suffisamment rapide car la demande proviendrait d'une typesseahead sur un webclient. P> premier_name code>,
last_name code> colonnes mais ne possède pas de
pleine_name code> 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. P>
4 Réponses :
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
inférieur code> n'est pas nécessaire sauf si la collation est sensible à la casse.
comme '% ..%' code> devra effectuer une numérisation de table complète de toute façon, car il ne peut pas utiliser aucun index.
Concat code> causera le même problème aussi. Enfin, l'opération similaire ici ne recherche pas i> recherche de paramètres, juste une chaîne contenant
{@ ....} code>.
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%';
Cela obligera une table complète
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
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%'
Cela entraînera une analyse de la table complète car elle ne peut pas tirer parti de tout index pour deux raisons - concat code> crée une valeur qui n'existe pas dans un index et
comme '% Leon%% ' code> recherches dans l'intégralité de l'index, quelque chose qui ne peut pas utiliser d'index normaux
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 i> préfixes i> (c.-à-d.
comme 'ABC%' code>) 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. code> Cela signifie-t-il que vous n'avez besoin que d'une recherche préfixe i>?
où le nom_texte comme @text + '%' ou last_name comme @text + '%' code>. Si vous indexez
premier_name code> et
last_name code> séparément, la requête devient une plage i> recherche sur les deux index
La recherche a à la casse insensible. code> 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?