Mysql 从表中获取WHERE子句的条件

Mysql 从表中获取WHERE子句的条件,mysql,sql,where-clause,Mysql,Sql,Where Clause,我有表1,它只有两列:id和condition。例如: id condition -------------------- 100 caption LIKE "%xyz%" 200 tag=5 300 color>153 ... 用户向服务器发送一个id,并且必须根据该id的条件在表2上运行特定的select查询。例如,如果将id 100发送到服务器,则必须运行此查询: SELECT * FROM table2 WHERE caption LIKE

我有表1,它只有两列:id和condition。例如:

id    condition
--------------------
100   caption LIKE "%xyz%"
200   tag=5
300   color>153
...
用户向服务器发送一个id,并且必须根据该id的条件在表2上运行特定的select查询。例如,如果将id 100发送到服务器,则必须运行此查询:

SELECT * FROM table2 WHERE caption LIKE "%xyz%"
如何从表1中获取条件并使用该条件运行查询?我已经试过了:

SELECT * FROM table2 INNER JOIN table1 AS t1 ON t1.id=... WHERE t1.condition
但是,我得到了以下警告,但没有结果

警告:1292截断了不正确的双精度值:“标题类似于%xyz%”


这是不可能的,如果可能的话,这将是一个巨大的存储SQL注入安全漏洞。为了能够做到这一点,您将需要一些东西来解析存储的条件并动态地评估条件。据我所知,MySQL没有为此内置任何东西。

这是不可能的,如果可能的话,这将是一个巨大的存储SQL注入安全漏洞。为了能够做到这一点,您将需要一些东西来解析存储的条件并动态地评估条件。据我所知,MySQL没有为此内置任何东西。

这在MySQL 5+中是可能的,使用准备好的语句。可以使用条件id作为参数创建过程:

DELIMITER //

CREATE PROCEDURE get_from_table2_by_condition_id(IN conditionId bigint)
BEGIN
    SET @condition = NULL;

    SELECT cond
    INTO @condition
    FROM table1
    WHERE id = conditionId;
    
    SET @sql = CONCAT('SELECT * FROM table2 WHERE ', COALESCE(@condition, 'FALSE'));
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

END//

DELIMITER ;

CALL get_from_table2_by_condition_id(100);
请参阅本文中的一个工作示例,这在MySQL 5+中可以使用准备好的语句。可以使用条件id作为参数创建过程:

DELIMITER //

CREATE PROCEDURE get_from_table2_by_condition_id(IN conditionId bigint)
BEGIN
    SET @condition = NULL;

    SELECT cond
    INTO @condition
    FROM table1
    WHERE id = conditionId;
    
    SET @sql = CONCAT('SELECT * FROM table2 WHERE ', COALESCE(@condition, 'FALSE'));
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

END//

DELIMITER ;

CALL get_from_table2_by_condition_id(100);

请参阅本

中的一个工作示例,我并不特别建议您存储所描述的SQL代码

但是你有一个客户端和一个服务器。解决方案只是查询表1中的条件,然后从中构造所需的查询。这需要两个查询

您可以在数据库中设置一个存储过程,该过程使用动态SQL实现相同的目的

这不可取的原因有几个:

代码可能会引入语法错误,这些错误很难调试。 根据表1中的安全特性,该代码需要SQL注入。 对基础表的更改可能会使条件无效。 什么是替代方案?一种可能性是为不同的条件创建单独的视图。或者,只需创建一个查询并传入参数:

select t2.*
from table2 t2
where (caption like :caption or :caption is null) and
      (tag = :tag or :tag is null) and 
      (color > :color or :color is null);

我并不特别推荐像您描述的那样存储SQL代码

但是你有一个客户端和一个服务器。解决方案只是查询表1中的条件,然后从中构造所需的查询。这需要两个查询

您可以在数据库中设置一个存储过程,该过程使用动态SQL实现相同的目的

这不可取的原因有几个:

代码可能会引入语法错误,这些错误很难调试。 根据表1中的安全特性,该代码需要SQL注入。 对基础表的更改可能会使条件无效。 什么是替代方案?一种可能性是为不同的条件创建单独的视图。或者,只需创建一个查询并传入参数:

select t2.*
from table2 t2
where (caption like :caption or :caption is null) and
      (tag = :tag or :tag is null) and 
      (color > :color or :color is null);

您如何与SQL交互,例如与PHP或其他东西交互?@Martin与PHPHow您与SQL交互,例如与PHP或其他东西交互吗?@Martin与PHP交互