0

C#演算子に似た機能を探していますか?:https ://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/conditional-operator

2つのパラメータに基づいてサーバー側でデータをフィルタリングする必要があります。

  1. @CountryIDs-カンマ区切りの値のリストです。例:「27,28,81」-CountryID 27、CountryID 28、CountryID81を意味します

  2. 顧客名と一致する@Keyword。

選択する必要のあるCountryIDの完全なリストを提供したくない場合がありますが、すべてを選択したい場合があります。「」のようなものです。CSVのようなCSVのリストを提供できるカスタム関数「CSV2Table_fn」を作成しました。 CountryID。

DECLARE @CountryIDs nvarchar(4000), @Keyword nvarchar(50)
SET @CountryIDs = '25,28,81'
SET @Keyword = null


if (len(@Keyword) > 0) -- search for names matching keyword
    begin
    
        SELECT Name, CountryID FROM Company 
                WHERE CountryID IN (
                SELECT DISTINCT ItemValue FROM CSV2Table_fn(
                        ISNULL((SELECT 
                            CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0   THEN @CountryIDs
                            ELSE null
                            END
                    ),CountryID),',')
            )
            AND Name LIKE '%' + @Keyword + '%'      
            
    end
else -- no keyword provided
    begin
        
        SELECT Name, CountryID FROM Company 
        WHERE CountryID IN (
        SELECT DISTINCT ItemValue FROM CSV2Table_fn(
            ISNULL((SELECT 
                        CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0   THEN @CountryIDs
                        ELSE null
                        END
                ),CountryID),',')
        )
                end
  • 編集:コードは想定どおりに機能するようになりました。ただし、これはあまりクリーンではなく、おそらく最適化できます。
4

2 に答える 2

1

あなたはこのようなことをすることができますか?

SELECT Name, CountryID 
FROM   Company 
WHERE  CHARINDEX(',' + CONVERT(varchar(100), CountryID) + ',', ',' + ISNULL(@CountryIDs, CONVERT(varchar(100), CountryID)) + ',') > 0
AND    Name LIKE '%' + ISNULL(@Keyword, '') + '%'

**少しシンプルに編集され、nullの@CountryIDsパラメータを処理します。

于 2012-07-04T16:08:20.287 に答える
0

nullや「123,456,789」などのCSVを@CountryIDsの値として渡すことができるようにするには、次のように使用しました。

 SELECT Name, CountryID FROM Company  
    WHERE CountryID IN ( 
    SELECT DISTINCT ItemValue FROM CSV2Table_fn( 
        ISNULL((SELECT  
                    CASE WHEN (SELECT COUNT(*) FROM (SELECT DISTINCT ItemValue FROM CSV2Table_fn(@CountryIDs,',')) t) > 0   THEN @CountryIDs 
                    ELSE null 
                    END 
            ),CountryID),',') 
    )
于 2012-07-04T17:43:59.497 に答える