使用WHERE子句进行SELECT,该子句作为字符串存储在另一个表中

时间:2017-10-07 14:20:17

标签: mysql string where

在MySQL中,我尝试使用WHERE子句从表中选择行,该子句不是固定的(事先已知),而是存储在另一个表中,并将从其他表中提取在运行时表。

尽管Stackoverflow上已经发布了看似相似的问题,但没有一个问题可以解决这个问题。

我想要实现的目标如下:

SELECT * FROM users WHERE (SELECT user_condition FROM user_condition_table WHERE id = '1')

子查询

SELECT user_condition FROM user_condition_table WHERE id = '1'

会产生字符串

  

first_name喜欢' Br'和last_name喜欢' A%'

所以总体查询看起来像:

SELECT * FROM users WHERE first_name like 'Br' and last_name like 'A%'

我想这里的问题是select的返回字符串是以字符串形式返回的,而不是作为SQL语句返回的。 有没有办法让这项工作?

2 个答案:

答案 0 :(得分:1)

您必须使用动态SQL - > Prepare / Execute / Deallocate命令
Dynamic SQL

  

动态SQL是一种编程技术,可用于构建SQL   语句在运行时动态。你可以创建更一般的   目的,灵活的应用程序通过使用动态SQL因为完整   编译时可能不知道SQL语句的文本。

简单live example

DROP TABLE  IF exists Users;
CREATE TABLE USERS(
  first_name varchar(20),
  last_name varchar(20)
);

INSERT INTO Users VALUES('Tom','Smile'),('Bob','Hamilton'),('Jane','Moon');

DROP TABLE  IF exists user_condition_table;
CREATE TABLE user_condition_table(
  id int,
  user_condition Varchar(100)
);


INSERT INTO User_condition_table 
VALUES(1, 'first_name like ''B%'' and last_name like ''H%''');

和查询:

SET @x = ( SELECT user_condition FROM user_condition_table WHERE id = '1');
SET @x = concat('SELECT * FROM USERS WHERE ', @x );
SELECT @x;

PREPARE stmt2 FROM @x;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt2;

答案 1 :(得分:0)

这是一个有趣的问题。我从来没有尝试过,因为我在应用程序代码中做了这样的事情直到现在。然而,我对这个主题感兴趣,并提出了以下解决方案:

SELECT @cond := user_condition FROM user_condition_table WHERE (id = 1);
SELECT @sqlstring := CONCAT('SELECT * FROM users WHERE ', @cond);
PREPARE sqlquery FROM @sqlstring;
EXECUTE sqlquery;
DEALLOCATE PREPARE sqlquery;

一些评论:

  • 您似乎需要使用会话变量(由前导@表示)。
  • 这不是存储过程;它只是一些普通的SQL语句,您可以直接在MySQL客户端中键入,例如。