0

我有一个非常有趣的问题。我有一个带有多项选择下拉菜单的 SSRS 报告。下拉菜单允许选择多个值或所有值。所有的价值观都不是问题。

问题是 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
4

3 回答 3

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+'%'

这两个版本是等效的,应该产生相同的执行计划。

于 2012-08-22T18:06:45.700 回答
1

更好的方法是拥有一个 TeamsTable (teamID, teamName, ...) 和 teamMembersTable (teamMemberID, teamID, teamMemberDetails, ...)。
然后你建立你的下拉列表
SELECT ... FROM TeamsTable ...;

SELECT ... FROM teamMembersTable WHERE teamID IN (valueFromYourDropDown);

或者您可以将您的 teamID 或 teamName(或两者)存储在您的(等效的)teamMembersTable 中

于 2012-08-22T18:19:48.967 回答
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
于 2012-08-22T18:27:43.683 回答