动态SQL列添加

时间:2016-01-28 07:17:25

标签: sql sql-server sql-server-2008 dynamic-sql

我的查询类似于:

SELECT t1, t2, t3
FROM Table
WHERE v1 = 'one' AND v2 ='two' AND v3 = 'three';

现在v1v2v3的值来自前端。用户可以传递或不传递所有三个值,甚至可以传递它们的组合,例如仅v1v2或仅v2v3等。

我的问题是如何动态地将v1v2v3传递给查询,就像用户从未提供v2一样,该列本身不应该在那里。

希望我明白自己。任何形式的帮助将不胜感激。

5 个答案:

答案 0 :(得分:0)

如果我们假设v1v2v3来自用户界面的NULL值,如果它们没有通过,那么你可以尝试使用COALESCE()函数:

SELECT t1, t2, t3
FROM Table
WHERE COALESCE(v1, 'one') = 'one' AND COALESCE(v2, 'two') ='two' AND
    COALESCE(v3, 'three') = 'three';

现在,如果用户未传递三列中的任何一列,则在确定要在结果集中包含哪些记录时,查询将有效地忽略它们。

答案 1 :(得分:0)

您的方案中有两种方法。

1.从代码(Java或.Net等)

SQL查询应该连接和子句和条件,如v1 =' ONE'当且仅当用户选择该选项时。这可以通过IF条件简单地实现。

2.我认为有效的第二种方法。

使用案例陈述处理它。

        DECLARE @V1 VARCHAR(10), @V2 VARCHAR(10), @V3 VARCHAR(10)

        SELECT T1, T2, T3 FROM TABLE_1
        WHERE CASE @V1 WHEN 'A' THEN  'A' ELSE V1 END = @V1
        AND CASE @V2 WHEN  'A' THEN  'A' ELSE V2 END = @V2
        AND CASE @V3 WHEN  'A' THEN  'A' ELSE V3 END = @V3

注意:在这里你需要传递至少默认值,例如" A"当用户没有选择任何东西时

答案 2 :(得分:0)

您可以使用动态SQL。试试这样,

DECLARE @v1     VARCHAR(256)='',
        @v2     VARCHAR(256)='',
        @v3     VARCHAR(256)='',
        @cmd    NVARCHAR(max)='',
        @filter NVARCHAR(max)=' where 1=1 '

IF @v1 IS NOT NULL
   AND @v1 <> ''
  BEGIN
      SET @filter+=' and v1=' + @v1
  END

IF @v2 IS NOT NULL
   AND @v2 <> ''
  BEGIN
      SET @filter+=' and v2=' + @v2
  END

IF @v3 IS NOT NULL
   AND @v3 <> ''
  BEGIN
      SET @filter+=' and v3=' + @v3
  END

SET @cmd='SELECT t1, t2, t3
FROM Table' + @filter

EXEC Sp_executesql
  @cmd 

答案 3 :(得分:0)

让参数

--volumes-from

现在,

MySQL

答案 4 :(得分:0)

我认为你需要这样的东西:

DECLARE @v1 int = 0, @v2 int = null, @v3 int = 0

DECLARE @sql as nvarchar(MAX) = 
    'SELECT ' + REPLACE(
        CASE WHEN @v1 IS NOT NULL THEN 't1,' ELSE '' END +
        CASE WHEN @v2 IS NOT NULL THEN 't2,' ELSE '' END +
        CASE WHEN @v3 IS NOT NULL THEN 't3,' ELSE '' END + '#', ',#', ' ') +
    'FROM Table ' +
    'WHERE ' + REPLACE(
        CASE WHEN @v1 IS NOT NULL THEN ' t1 = ' + cast(@v1 as nvarchar(30)) + ' AND' ELSE '' END +
        CASE WHEN @v2 IS NOT NULL THEN ' t2 = ' + cast(@v2 as nvarchar(30)) + ' AND'ELSE '' END +
        CASE WHEN @v3 IS NOT NULL THEN ' t3 = ' + cast(@v3 as nvarchar(30)) + ' AND'ELSE '' END + '#', 'AND#', '')

EXEC(@sql);

注意:在以上基于@v1@v2@v3输入值的查询中,您的列会发生变化;)。