我的查询类似于:
SELECT t1, t2, t3
FROM Table
WHERE v1 = 'one' AND v2 ='two' AND v3 = 'three';
现在v1
,v2
和v3
的值来自前端。用户可以传递或不传递所有三个值,甚至可以传递它们的组合,例如仅v1
和v2
或仅v2
和v3
等。
我的问题是如何动态地将v1
,v2
和v3
传递给查询,就像用户从未提供v2
一样,该列本身不应该在那里。
答案 0 :(得分:0)
如果我们假设v1
,v2
和v3
来自用户界面的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
输入值的查询中,您的列会发生变化;)。