0

非常に興味深い問題があります。複数選択ドロップダウンのあるSSRSレポートがあります。ドロップダウンでは、複数の値またはすべての値を選択できます。すべての値が問題ではありません。

問題は1つまたは複数のオプションの組み合わせです

ドロップダウンで「AAA」を選択すると、「AAA」、「AAA 1」、「AAA2」の3つの値が返されます。

現在、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+'%'

2 つのバージョンは同等であり、同じ実行計画を生成する必要があります。

于 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

多くの作業を行わずに IN を 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 に答える