2012-08-22 48 views
0

我有一個非常有趣的問題。我有一個多選的下拉式SSRS報告。 下拉允許選擇多個值或所有值。 所有的值都不是問題。用IN和Like選擇

的問題是1或大於1級的選項

組合當我在下拉「AAA」中選擇它應該返回3個值:「AAA」,「AAA 1」,「AAA 2」

現在只返回1值。

問題:

如何使報表的工作就像一個什麼樣的?

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

你能後有點'SplitListString()'?此外,這可能是一個延伸,但是你的值不是全部3個字符,後面跟着一個數字? – Kermit

+0

我可以但它不會有所作爲,因爲問題出在select和where子句中。分割字符串只創建一個以逗號分隔的表格 –

+0

我添加了分割功能 –

回答

3

你不行。但是,你可以像類似的工作:

select * 
from mytable t join 
    SplitListString(@Team, ',') s 
    on t.ColumnA like '%'+s.param+'%' 

也就是說,將分割列表移動到顯式連接。替換爲函數返回的實際列名稱,並使用類似的函數。

或者,如果你喜歡:

select * 
from mytable t cross join 
    SplitListString(@Team, ',') s 
where t.ColumnA like '%'+s.param+'%' 

兩個版本是等價的,應該產生相同的執行計劃。

+0

這將很難進行連接。這必須在where子句 –

+0

是的,如果他們選擇「ALL」,那麼不需要JOIN。 –

+0

+1,好主意。但是表演呢? – Tamir

1

更好的方法是擁有一個TeamsTable(teamID,teamName,...)和teamMembersTable(teamMemberID,teamID,teamMemberDetails,...)。
然後你的建立你的下拉列表中爲
SELECT ... FROM TeamsTable ...;

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

或者,你可以存儲你的teamID或teamName(或兩者)在(相當於)teamMembersTable

+0

這不起作用,因爲下拉列表允許多個選擇,目標表需要執行類似的搜索。 –

+0

我拼寫錯誤,上面的代碼應該讀取:'teamID IN(valuesFromYourDropDown);'(multiple valueS) - 這是IN子句的原因。從我的部分代碼中,我假定(可能不正確)你有一個團隊/組的下拉列表,然後你想尋找這些團隊/組的「成員」。如果** IS **的目的是在每個記錄上存儲組ID /名稱** IS **是最好的方式。通過這種方式,您可以添加更多組並通過操作表中的數據來重新組合現有成員。 –

0

你沒有很多工作就不會像INK那樣工作。你可以做這樣的事情,雖然(它會很高興地看到一些實際的數據,但這樣我們就可以提供更好的解決方案):

SELECT * 
FROM table 
WHERE LEFT(field,3) IN @Parameter 

如果你想更好的性能,在創建代碼字段中輸入您表和更新這樣的:

UPDATE table 
SET codeField = LEFT(field,3) 

然後,只需在該字段添加一個索引並運行此查詢,讓您的結果:

SELECT * 
FROM table 
WHERE codeField IN @Parameter 
+0

我在樣本中放置的數據非常接近真實情況。 –

+0

好的,如果你在下拉菜單中有一定數量的項目,並且你在尋找以這些項目開頭的字段,那麼我不明白爲什麼Germann或我的建議不起作用。 – Jim