Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据列值形成查询_Sql_Sql Server_Multiple Columns_Concat - Fatal编程技术网

Sql 根据列值形成查询

Sql 根据列值形成查询,sql,sql-server,multiple-columns,concat,Sql,Sql Server,Multiple Columns,Concat,我使用的是sql server 2012,我有一个如下表: FieldName FieldValue DivisionId 1 DivisionId 2 DivisionId 3 CompanyId 2 CompanyId 3 LocationId 1 我想要的是连接列并形成一个where子句查询,如下所示 (DivisionId=1 OR DivisionId=2 OR DivisionId=3) AND (CompanyId=2 OR Co

我使用的是sql server 2012,我有一个如下表:

FieldName     FieldValue
DivisionId    1
DivisionId    2
DivisionId    3
CompanyId     2
CompanyId     3
LocationId    1 
我想要的是连接列并形成一个where子句查询,如下所示

(DivisionId=1 OR DivisionId=2 OR DivisionId=3) AND
(CompanyId=2 OR CompanyId=3) AND
(LocationId = 1)
我能弄明白的是,我需要像这样连接列和值

DECLARE @Query VARCHAR(MAX)

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

SELECT @Query;

但此代码将无法处理或处理条件。

请尝试以下解决方案:

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
语句(例如)


首先为什么要使用动态sql?在大多数情况下,动态sql可以也应该被禁用。对,但根据要求,我必须使用它。现在别无选择
DECLARE @SqlStatement NVARCHAR(MAX)
SET @SqlStatement = 'SELECT ... FROM dbo.Table1 WHERE ' + @Predicate
EXEC sp_executesql @SqlStatement