2010-06-08 16 views
0

Im en utilisant Microsoft SQL Server que je pense est T-SQL ou ANSI SQL.Erreur de syntaxe SQL

Je souhaite rechercher une base de données avec une chaîne. Les matchs qui correspondent à la mendicité de la chaîne devraient venir en premier, puis trier par ordre alphabétique.

I.e. Si la table contient FOO, BAR et RAP

une recherche de la chaîne 'R' doit céder:

RAP
BAR

Dans cet ordre.

Voici ma tentative:

SELECT  Name 
FROM  MyTable 
WHERE  (Name LIKE '%' + @name + '%') 
ORDER BY (IF(Name LIKE @name + '%',1,0)) 

Le message d'erreur est le suivant: "doit déclarer @name variable scalaire"

Répondre

3
declare @name varchar(10) 
set @name='R' 
SELECT  Name 
FROM  (select 'foo' as name union select 'RAP' union select 'BAR') MyTable 
WHERE  (Name LIKE '%' + @name + '%') 
ORDER BY charindex(@name ,name) 
+0

J'aime cette solution, le charindex est plus compact et donne un meilleur tri. – Robert

2

.

DECLARE @name VARCHAR(MAX); 
SET @name = 'foo'; 

SELECT  Name 
FROM  MyTable 
WHERE  Name LIKE '%' + @name + '%' 
ORDER BY CASE WHEN Name LIKE @name + '%' THEN 1 ELSE 0 END; 
+0

Ce fut ce que je essayait de faire avec la déclaration IF. – Robert

1

Semble que vous manqué variables déclaration:

DECALRE @name varchar(50) -- adjust type and length of variable 
SET @name = 'phrase' -- for MSSQL 2008 you can do it in one line 
1

D'autres solutions semblent manquer la partie "ordre alphabétique":

DECLARE @Search VARCHAR(MAX) 
SET  @Search = 'R' 

SELECT  0, Name 
FROM  MyTable 
WHERE  Name LIKE @Search + '%' 
UNION ALL 
SELECT  1, Name 
FROM  MyTable 
WHERE  Name like '%_' + @Search + '%' 
ORDER BY 1, 2 
+0

C'est une idée intelligente, j'ai essayé de le faire de cette façon pour commencer, mais je ne pouvais pas faire fonctionner le syndicat. – Robert