查询以查找用户

时间:2012-02-04 10:42:10

标签: sql tsql

我需要编写一个查询来获取用户列表,其中他们的全名在名为 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%');

但它在文件中不可用}

4 个答案:

答案 0 :(得分:1)

如果您想避免多次写LIKE,并且您正在使用MSSQL,请查看 temporary tables table variables

一般的想法是将所有搜索词(firstname - lastname组合)放在临时表/表变量中,然后执行查询,检查dm_user.description是否包含至少一个搜索词。< / p>

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

答案 1 :(得分: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%'

答案 2 :(得分:0)

您可以使用FreeText Search for MSSQL,但是idk如何处理这些名称。

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

答案 3 :(得分:0)

如果您只是试图避免使用UPPER()语法,那么您可以声明变量(取决于您的DBMS)

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

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