创建SQL命令以返回匹配或其他所有内容

时间:2009-05-25 13:53:36

标签: sql

我的应用程序中有三个复选框。如果用户勾选了我想要返回的方框的组合,则勾选方框,如果未选中方框,我只想返回所有内容。我可以使用单个SQL命令执行此操作吗?

7 个答案:

答案 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语句,则只需生成:

  1. 如果未选择任何内容或全部(使用您的语言检查),您只需发出非过滤版本:

    SELECT ... FROM ...

  2. 如果选中某些复选框,则会创建一个WHERE clause

    SELECT ... FROM ... WHERE MyTypeID IN(3,5,7)

  3. 这是单个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)