在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语句返回的。 有没有办法让这项工作?
答案 0 :(得分:1)
您必须使用动态SQL - > Prepare / Execute / Deallocate命令
Dynamic SQL
动态SQL是一种编程技术,可用于构建SQL 语句在运行时动态。你可以创建更一般的 目的,灵活的应用程序通过使用动态SQL因为完整 编译时可能不知道SQL语句的文本。
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;
一些评论:
@
表示)。