我有一个非常有趣的问题。我有一个带有多选下拉列表的SSRS报告。 下拉列表允许选择多个值或所有值。 所有值都不是问题。
问题是1或多于1个选项的组合
当我在下拉菜单中选择'AAA'时,它应返回3个值:'AAA','AAA 1','AAA 2'
现在只返回1个值。
问题:
如何使IN语句像LIKE一样工作?
The Drop down select
SELECT '(All)' AS team, '(All)' AS Descr
UNION ALL
SELECT 'AAA' , 'AAA'
UNION ALL
SELECT 'BBB' , 'BBB'
Table Mytable
ColumnA Varchar(5)
Values for ColumnA
'AAA'
'AAA 1'
'AAA 2'
'BBB'
'BBB 1'
'BBB 2'
SELECT * FROM Mytable
WHERE ColumnA IN (SELECT * FROM SplitListString(@Team, ',')))
Split function
CREATE FUNCTION [dbo].[SplitListString]
(@InputString NVARCHAR(max), @SplitChar CHAR(1))
RETURNS @ValuesList TABLE
(
param NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @ListValue NVARCHAR(max)
DECLARE @TmpString NVARCHAR(max)
DECLARE @PosSeparator INT
DECLARE @EndValues BIT
SET @TmpString = LTRIM(RTRIM(@InputString));
SET @EndValues = 0
WHILE (@EndValues = 0) BEGIN
SET @PosSeparator = CHARINDEX(@SplitChar, @TmpString)
IF (@PosSeparator) > 1 BEGIN
SELECT @ListValue = LTRIM(RTRIM(SUBSTRING(@TmpString, 1, @PosSeparator -1 )))
END
ELSE BEGIN
SELECT @ListValue = LTRIM(RTRIM(@TmpString))
SET @EndValues = 1
END
IF LEN(@ListValue) > 0 BEGIN
INSERT INTO @ValuesList
SELECT @ListValue
END
SET @TmpString = LTRIM(RTRIM(SUBSTRING(@TmpString, @PosSeparator + 1, LEN(@TmpString) - @PosSeparator)))
END
RETURN
END
答案 0 :(得分:3)
你做不到。但是,你可以使类似的工作:
select *
from mytable t join
SplitListString(@Team, ',') s
on t.ColumnA like '%'+s.param+'%'
即,将拆分列表移动到显式连接。替换为函数返回的实际列名,并使用like函数。
或者,如果您愿意:
select *
from mytable t cross join
SplitListString(@Team, ',') s
where t.ColumnA like '%'+s.param+'%'
这两个版本是等效的,应该生成相同的执行计划。
答案 1 :(得分:1)
更好的方法是拥有TeamsTable(teamID,teamName,...)和teamMembersTable(teamMemberID,teamID,teamMemberDetails,...)。
然后,您将下拉列表构建为
SELECT ... FROM TeamsTable ...;
和
SELECT ... FROM teamMembersTable WHERE teamID IN (valueFromYourDropDown);
或者您可以将teamID或teamName(或两者)存储在(相当于)teamMembersTable
中答案 2 :(得分:0)
如果没有大量工作,你不会像LIKE一样工作。你可以做这样的事情(虽然看到你的一些实际数据会很好,所以我们可以提供更好的解决方案):
SELECT *
FROM table
WHERE LEFT(field,3) IN @Parameter
如果您希望获得更好的性能,请在表格上创建一个代码字段并按照以下方式更新:
UPDATE table
SET codeField = LEFT(field,3)
然后只需在该字段上添加索引并运行此查询即可获得结果:
SELECT *
FROM table
WHERE codeField IN @Parameter