2017-10-07 65 views
2

在MySQL中,我試圖從表中選擇行使用WHERE子句,這是不固定的(預先知道),而是存儲在另一個表中並且將在運行時從另一個表中拉出。選擇與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' 和姓氏LIKE' A%'

所以整個查詢看起來像:

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

我想這裏的問題是,從選擇返回的字符串返回爲字符串,而不是作爲一個SQL語句。 有什麼辦法可以做到這一點?

+0

您需要了解動態SQL。你不能用簡單的'select'來做到這一點。 –

+0

你爲什麼不簡單地分兩步來做?例如,在PHP中,您可以首先獲取子查詢結果,然後構建主查詢。 –

+0

@KIKOSoftware我想在Mysql中保持這項任務自動化,而無需使用任何編碼語言。 –

回答

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; 
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客戶端直接輸入。
相關問題