我的应用程序中有三个复选框。如果用户勾选了我想要返回的方框的组合,则勾选方框,如果未选中方框,我只想返回所有内容。我可以使用单个SQL命令执行此操作吗?
答案 0 :(得分:3)
我建议在WHERE子句中执行以下操作;
...
AND (@OnlyNotApproved = 0 OR ApprovedDate IS NULL)
它不是一个SQL命令,但对我来说效果很好。基本上,第一部分检查是否设置了开关(选中复选框)。第二个是选中复选框时的过滤器。在这里你可以做任何你通常做的事情。
答案 1 :(得分:2)
确定。下面的示例假设SQL Server,但您获得了要点。
您可以使用一些动态SQL轻松完成 假设您将复选框作为位值传递给sproc。
DECLARE bit @cb1
DECLARE bit @cb2
DECLARE bit @cb3
DECLARE nvarchar(max) @whereClause
IF(@cb1 = 1)
SET @whereClause = @whereClause + ' AND col1 = ' + @cb1
IF(@cb2 = 1)
SET @whereClause = @whereClause + ' AND col2 = ' + @cb2
IF(@cb3 = 1)
SET @whereClause = @whereClause + ' AND col3 = ' + @cb3
DECLARE nvarchar(max) @sql
SET @sql = 'SELECT * FROM Table WHERE 1 = 1' + @whereClause
exec (@sql)
答案 2 :(得分:2)
您可以使用动态where子句构建SQL语句:
string query = "SELECT * FROM TheTable WHERE 1=1 ";
if (checkBlackOnly.Checked)
query += "AND Color = 'Black' ";
if (checkWhiteOnly.Checked)
query += "AND Color = 'White' ";
或者您可以使用变量创建存储过程来执行此操作:
CREATE PROCEDURE dbo.GetList
@CheckBlackOnly bit
, @CheckWhiteOnly bit
AS
SELECT *
FROM TheTable
WHERE
(@CheckBlackOnly = 0 or (@CheckBlackOnly = 1 AND Color = 'Black'))
AND (@CheckWhiteOnly = 0 or (@CheckWhiteOnly = 1 AND Color = 'White'))
....
答案 3 :(得分:0)
当然可以。 如果在代码中编写SQL SELECT语句,则只需生成:
如果未选择任何内容或全部(使用您的语言检查),您只需发出非过滤版本:
SELECT ... FROM ...
如果选中某些复选框,则会创建一个WHERE clause
:
SELECT ... FROM ... WHERE MyTypeID IN(3,5,7)
这是单个SQL命令,但当然根据选择的不同而不同。 现在,如果您想使用一个存储过程来完成这项工作,那么实现将取决于数据库引擎,因为您需要的是能够传递多个参数。我不鼓励使用只有简单3参数的过程,因为当你添加另一个复选框时,你也必须改变SQL过程。
答案 4 :(得分:0)
问题没有指定数据库产品或编程语言。但是,可以使用ANSI SQL以交叉产品方式完成。
假设一种编程语言使用$ var $来对字符串进行变量插入。
在服务器上,您可以在列表中获得所有选定的值,因此如果选择前两个框,您将获得一个GET / POST变量,如
http://url?colors=black,white
所以你建立一个这样的查询(伪代码)
colors = POST['colors'];
colors_list = replace(colors, ',', "','"); // separate colors with single-quotes
sql = "WHERE ('$colors$' == '') OR (color IN ('$colors_list$'));";
你的数据库会看到:
WHERE ('black,white' == '') OR (color IN ('black','white')); -- some selections
WHERE ('' == '') OR (color IN ('')); -- nothing selected (matches all rows)
哪个是有效的SQL查询。当没有选择任何内容时,第一个条件匹配任何行,否则OR语句的右侧将匹配作为其中一种颜色的任何行。此查询无需修改即可扩展为无限数量的选项。每个子句的括号也是可选的,但为了清楚起见,我使用它们。
当然,您需要使用参数保护字符串不受SQL注入的影响,或者根据需要进行转义。否则,颜色的恶意值将使您的数据库受到攻击。
答案 5 :(得分:0)
SELECT *
FROM table
WHERE value IN
(
SELECT option
FROM checked_options
UNION ALL
SELECT option
FROM all_options
WHERE NOT EXISTS (
SELECT 1
FROM checked_options
)
)
内部子查询将返回已选中选项的列表,如果列表为空,则返回所有可能的选项。
对于MySQL
,最好使用它:
SELECT *
FROM t_data
WHERE EXISTS (
SELECT 1
FROM t_checked
WHERE session = 2
)
AND opt IN
(
SELECT opt
FROM t_checked
WHERE session = 2
)
UNION ALL
SELECT *
FROM t_data
WHERE NOT EXISTS (
SELECT 1
FROM t_checked
WHERE session = 2
)
MySQL
会在IMPOSSIBLE WHERE
的任意一个上发现SELECT
,并且只会执行相应的。{/ p>
请参阅我的博客中的此条目,了解效果详情:
答案 6 :(得分:0)
如果将null传递给适当的值,那么它会将该特定列与其自身进行比较。如果传递值,则会将列与值
进行比较CREATE PROCEDURE MyCommand
(
@Check1 BIT = NULL,
@Check2 BIT = NULL,
@Check3 BIT = NULL
)
AS
SELECT *
FROM Table
WHERE Column1 = ISNULL(@Check1, Column1)
AND Column2 = ISNULL(@Check2, Column2)
AND Column3 = ISNULL(@Check3, Column3)