我有一个包含这样的列的表:
Table: teeburu
Columns:
- aidi int identity
- bariu varchar(8000)
我想要一个存储过程,其输入是一个字符串,例如:
abc qwe ax xyza
用户可以自由输入长度和空格。
它的作用是选择列bariu
包含所有列的所有行:abc
,qwe
,ax
,和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
包含至少一个列的所有行:abc
,qwe
,{ {1}}和ax
xyza
但我无法弄清楚如何所有而不是至少有一个。我的问题是如何做到这一点?
我正在使用MS SQL SERVER
答案 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