2012-02-04 4 views
1

Мне нужно написать запрос, чтобы получить список пользователей, где их полное имя имеет атрибут с именем описание. Имена пользователей хранятся в этом атрибуте ни в одном формате: -Запрос, чтобы найти пользователей

  • Фамилия Имя
  • LASTNAMEFirstname (без пробела)
  • ИмяФамилия

В таком случае, если мне нужно для поиска данный список пользователей (около 100) в этом атрибуте, я должен написать запрос, например select * from dm_user where UPPER("description") like '%FIRSTUSER_FIRSTNAME%' OR UPPER("description") like '%SECONDUSER_FIRSTNAME%' и т. д.

Является ли это способом, который я могу сделать hings более просто. Я ненавижу писать *UPPER("description") like* 100 раз. (Пожалуйста, предложите стандартный SQL-запрос). Мне нужно запустить этот запрос на Documentum и MSSQL.

Я просто хочу, чтобы иметь что-то вроде

{

select * from dm_user 
where UPPER("description") 
like IN ('%FIRSTUSER_FIRSTNAME%','%SECONDUSER_FIRSTNAME%'); 

, но его нет в наличии в Documentum}

+1

Возможный дубликат http://stackoverflow.com/questions/4855754/how-to-use-like-condition-with-multiple-values-in-sql-server -2005 – marapet

ответ

1

Можно использовать динамические запросы и позволить SQL Server писать эти строки 100 раз?

--DROP TABLE #User 
-- This is an EXAMPLE: keep using your names source 
CREATE TABLE #User(Id int, Name varchar(50)) 
INSERT INTO #User VALUES (1, 'First') 
INSERT INTO #User VALUES (2, 'Second') 
-- ... and so on 

DECLARE @Query nvarchar(max) 
SELECT @Query = 'SELECT * FROM DM_USER WHERE 1=0' + 
     (
      SELECT ' 
OR Description LIKE ' + QUOTENAME('%' + Name + '%', '''') 
      FROM #User 
      FOR XML PATH (''), TYPE 
     ).value('.', 'nvarchar(max)') 

PRINT '@Query = ' + ISNULL(@Query, 'NULL') 
EXEC sp_executesql @Query 

Результат:

@Query = SELECT * FROM DM_USER WHERE 1=0 
OR Description LIKE '%First%' 
OR Description LIKE '%Second%' 
0

Если ваш просто пытается избежать с помощью верхней() синтаксис все время вы можете объявить переменную (в зависимости от СУБД)

declare @description varchar(max) 
set @description= UPPER('description'); 

select 
    * 
from 
    dm_user 
where 
    @description like '%FIRSTUSER_FIRSTNAME%' 
    OR @description like '%SECONDUSER_FIRSTNAME%' 
+0

НЕТ Я хочу, чтобы не писать LIKE много раз – perilbrain

1

Если вы хотите, чтобы избежать написания LIKE много раз, и вы работаете с MSSQL, посмотрите на temporary tables или table variables.

Общая идея заключалась бы в том, чтобы поместить все поисковые термины (комбинации firstname - lastname) в переменную temp table/table, а затем выполнить запрос, который проверяет, содержит ли dm_user.description хотя бы один из условий поиска.

SELECT DISTINCT u.id 
FROM dm_users AS u, #tmp as t 
WHERE dm_users.description LIKE N'%' + t.searchterm + '%' 
+0

Мне жаль, но у меня нет привилегии создавать что-либо просто DQL – perilbrain

+0

Это все динамический sql. Вот статья, описывающая примеры: http://sergeb.com/blog/post/Dynamic-multi-value-SQL-LIKE.aspx – marapet

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