2010-06-08 4 views
0

Я использую Microsoft SQL Server, который, я думаю, является T-SQL или ANSI SQL.Ошибка синтаксиса SQL

Я хочу найти базу данных со строкой. Матчи, которые подходят для попрошайки строки, должны быть первыми, а затем отсортированы по алфавиту.

I.e. Если таблица содержит FOO, BAR и RAP

поиск строки 'R' должны давать:

RAP
BAR

В таком порядке.

Вот моя попытка:

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

Сообщение об ошибке: "необходимо объявить скалярную переменную @name"

ответ

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

Мне нравится это решение, лучшее, charindex более компактно и дает лучший порядок сортировки. – 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

Это было то, что я пытался сделать с утверждением IF. – Robert

1

Кажется, что вы пропустили переменной декларации:

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

Другие решения, кажется, пропустить "сортировать по алфавиту" часть:

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

Это умная идея, я пытался это сделать для начала, но я не мог заставить профсоюз работать. – Robert

Смежные вопросы