2017-06-28 2 views
0

値ごとのように私は、SQL Serverの2012を使用していますが、私はこのようなテーブルを持っている:フォーム、クエリの列が

FieldName  FieldValue 
DivisionId 1 
DivisionId 2 
DivisionId 3 
CompanyId  2 
CompanyId  3 
LocationId 1 

何私が欲しいのはCONCATENATE列であり、この

(DivisionId=1 OR DivisionId=2 OR DivisionId=3) AND 
(CompanyId=2 OR CompanyId=3) AND 
(LocationId = 1) 
のようなwhere句クエリを形成します

私は把握することができた何を、私はこの

DECLARE @Query VARCHAR(MAX) 

SELECT @Query = 
ISNULL(@Query,'') + IIF(@Query IS NOT NULL, ' AND ', '') + CONCAT(DF.FieldName,'=',DA.FieldValue) 
FROM TABLE 

SELECT @Query; 

のような列の値を連結する必要がある。しかし、このコードはありませんでしょうOR条件を処理する。

+0

なぜあなたが最初の場所で動的SQLを使用しますか?ほとんどの場合、動的SQLは使用できます。 –

+0

右ですが、要件ごとに私はそれを使用しなければなりません。今すぐ他の選択肢はありません –

答えて

1

てみてください、次の解決策:

DECLARE @eav TABLE (
    FieldName  NVARCHAR(128) NOT NULL, 
    FieldValue  VARCHAR(50) NOT NULL 
) 
INSERT @eav (FieldName, FieldValue) 
SELECT 'DivisionId', 1 UNION ALL 
SELECT 'DivisionId', 2 UNION ALL 
SELECT 'DivisionId', 3 UNION ALL 
SELECT 'CompanyId ', 2 UNION ALL 
SELECT 'CompanyId ', 3 UNION ALL 
SELECT 'LocationId', 1 

DECLARE @Predicate NVARCHAR(MAX) = N'' 
SELECT @Predicate = @Predicate 
     + CASE WHEN rn_asc = 1 THEN ' AND ' + FieldName + ' IN (' + LTRIM(FieldValue) ELSE '' END 
     + CASE WHEN rn_asc > 1 THEN ', ' + LTRIM(FieldValue) ELSE '' END 
     + CASE WHEN rn_desc = 1 THEN ') ' ELSE '' END 
FROM (
    SELECT *, 
      rn_asc = ROW_NUMBER() OVER(PARTITION BY x.FieldName ORDER BY x.FieldValue), 
      rn_desc= ROW_NUMBER() OVER(PARTITION BY x.FieldName ORDER BY x.FieldValue DESC) 
    FROM @eav x 
) y 
ORDER BY FieldName, FieldValue 
SELECT @Predicate = STUFF(@Predicate, 1, 5, '') 
SELECT @Predicate 
-- Results: CompanyId IN (2, 3) AND DivisionId IN (1, 2, 3) AND LocationId IN (1) 

は、その後、あなたが(たとえば)、動的SQL SELECT文を作成するために@Predicateを使用することができ

DECLARE @SqlStatement NVARCHAR(MAX) 
SET @SqlStatement = 'SELECT ... FROM dbo.Table1 WHERE ' + @Predicate 
EXEC sp_executesql @SqlStatement 
+1

驚くばかりの男はこれが魅力のように働いた。 –

関連する問題