SQL SELECT WHERE列包含所有分隔的字符串

时间:2017-06-30 05:53:52

标签: sql sql-server

我有一个包含这样的列的表:

Table: teeburu Columns: - aidi int identity - bariu varchar(8000)

我想要一个存储过程,其输入是一个字符串,例如: abc qwe ax xyza 用户可以自由输入长度和空格。

它的作用是选择列bariu包含所有列的所有行:abcqweax,和xyza

以下是我的尝试:

我创建了分割功能(从this page复制)

create FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))
returns @temptable
TABLE (nameIndex int identity(1,1),items varchar(8000))
as
begin
    declare @idx int
    declare
    @slice varchar(8000)

    select @idx = 1
    if len(@String)<1 or @String
    is null return

    while @idx!= 0
    begin
    set @idx =
    charindex(@Delimiter,@String)
    if @idx!=0
    set @slice = left(@String,@idx
    - 1)
    else
    set @slice = @String

    if(len(@slice)>0)
    insert
    into @temptable(Items) values(@slice)

    set @String =
    right(@String,len(@String) - @idx)
    if len(@String) = 0 break
    end

return
end

有了它,我设法写了一些内容来选择列bariu包含至少一个列的所有行:abcqwe,{ {1}}和ax

xyza

但我无法弄清楚如何所有而不是至少有一个。我的问题是如何做到这一点?

我正在使用MS SQL SERVER

2 个答案:

答案 0 :(得分:5)

您只需添加HAVING COUNT(*) = (SELECT COUNT(*) FROM list)

with list as(
    select * from dbo.split('abc qwe ax xyza',' ')
)
SELECT aidi, bariu  FROM teeburu
    INNER JOIN list
    ON bariu like '%'+ list.items+ '%'    
    GROUP BY aidi, bariu
    HAVING COUNT(*) = (SELECT COUNT(*) FROM list)

答案 1 :(得分:0)

我将修改split函数以获取参数计数。

这样做不会增加不会增加我的任务,也不会增加任何性能。

TABLE (nameIndex int identity(1,1),items varchar(8000),ParamCount int)

然后你已经循环了所以取一个变量并在每个循环上增加它的值 在这里插入变量值,

insert into @temptable(Items,ParamCount) values(@slice,@Newvar)

优点:您将逃避一个count(*)语句。

SELECT COUNT(*) FROM list

所以最终查询,

 SELECT aidi
    ,bariu
FROM teeburu
CROSS APPLY (
    SELECT Items
        ,paramcount
    FROM dbo.split('abc qwe ax xyza', ' ')
    ) list
WHERE bariu LIKE '%' + list.items + '%'
GROUP BY aidi
    ,bariu
HAVING COUNT(*) = list.paramcount

它还取决于你的真实查询和表格。也许你应该 通过这么多列

使用row_number而不是group