Запрос на поиск пользователей - PullRequest
1 голос
/ 04 февраля 2012

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

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

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

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

Я просто хочу что-то вроде

{* * тысяча двадцать-один

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

но его нет в documentum}

Ответы [ 4 ]

1 голос
/ 04 февраля 2012

Можно использовать динамические запросы и разрешить 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%'
1 голос
/ 04 февраля 2012

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

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

SELECT DISTINCT u.id
FROM dm_users AS u, #tmp as t
WHERE dm_users.description LIKE N'%' + t.searchterm + '%'
0 голосов
/ 04 февраля 2012

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

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

select 
    * 
from 
    dm_user 
where 
    @description like '%FIRSTUSER_FIRSTNAME%' 
    OR @description like '%SECONDUSER_FIRSTNAME%' 
0 голосов
/ 04 февраля 2012

Возможно, вы сможете использовать FreeText Search для MSSQL, но не знаете, как это будет обрабатывать имена.

http://msdn.microsoft.com/en-us/library/ms176078.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...