如何在sql的搜索字符串的基础上获取所有记录

时间:2014-12-05 07:07:09

标签: sql sql-server

我想根据搜索字符串

获取所有记录

E.G。

列名:FileName

MasterRoomTwo.jpg
BedRoom.png
MasterbedRoom.gif

在简单的场景中我可以使用

Declare @FileName  nvarchar(60) = NULL
set @FileName  = '.jpg'

SELECT * 
FROM JobAttachment 
WHERE AND Tags LIKE '%' + ISNULL(@FileName  ,FileName  ) + '%' 
ORDER BY updated DESC

但在我的情况下,我会像

一样
set @FileName  = '.jpg,.Png,gif'

那么如何进行这样的查询?

任何帮助将不胜感激。

由于

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT *
FROM   JobAttachment a
       JOIN (SELECT t1.nod.value('.', 'varchar(50)') tags
             FROM   (SELECT Cast('<N>.'
                                 + Replace(Replace(@FileName, '.', ''), ',', '</N><N>.')
                                 + '</N>' AS XML) AS format) t
                    CROSS APPLY format.nodes('/N') AS t1(nod)
             WHERE  t1.nod.value('.', 'varchar(50)') <> '.') fileformat
         ON a.tag LIKE ( '%' + fileformat.tags + '%' ) 

答案 1 :(得分:0)

您可以创建动态条件

Declare @FileName  nvarchar(60) = NULL
set @FileName  = '.jpg,.Png,gif'


--append a comma to the string to get correct results with empty strings 
--or strings with a single value (no commas)
SET @FileName = @FileName + ',';

declare @x XML
declare @FileSearch nvarchar(max)
select  @x = cast( '<F>' + replace ( @FileName,',','</F><F>') + '</F>' as xml)      
select @FileSearch = stuff( isnull(@FileSearch , '') +
                    ' OR FileName Like ''%'+ isnull(t.value('.','nvarchar(60)'),'') 
                    +'%''' ,1,3,'')
from @x.nodes('/F') as x(t)

然后创建动态查询以获得所需结果:

set @sql = 'select * from test where ' -- entire query goes here
            + @FileSearch

exec sp_executesql  @sql

DEMO

答案 2 :(得分:0)

试试这个。 拆分输入字符串并使用charindex

SELECT 'MasterRoomTwo.jpg' a INTO   #temp UNION
SELECT 'BedRoom.png' UNION
SELECT 'MasterbedRoom.gif' 

DECLARE @FileName NVARCHAR(60) 

SET @FileName = '.jpg,.Png,gif'

SELECT *
FROM   #temp
        JOIN (SELECT Rtrim(Ltrim(Split.a.value('.', 'VARCHAR(100)'))) fs
                   FROM   (SELECT Cast ('<M>' + Replace(@FileName, ',', '</M><M>')
                                        + '</M>' AS XML) AS Data) AS A
                          CROSS APPLY Data.nodes ('/M') AS Split(a)) ad
on  Charindex(fs, a) > 0