請嘗試以下...
DROP PROCEDURE IF EXISTS SimilarNames;
DELIMITER //
CREATE PROCEDURE SimilarNames(authorFullName VARCHAR(250))
BEGIN
SET @authorFullNameCommad = CONCAT('\'',
REPLACE(authorFullName,
' ',
'\', \''),
'\'');
SET @selectStatementString := CONCAT("SELECT authorID,",
" firstName,",
" middleName,",
" lastName ",
"FROM author ",
"WHERE ((firstName IN (",
@authorFullNameCommad,
")) + (middleName IN (",
@authorFullNameCommad,
")) + (lastName IN (",
@authorFullNameCommad,
"))) >=2;");
PREPARE selectStatement FROM @selectStatementString;
EXECUTE selectStatement;
DEALLOCATE PREPARE selectStatement;
END //
DELIMITER ;
CALL SimilarNames('Edgar Allan Poe');
該解決方案通過創建一個名爲PROCEDURE
SimilarNames
(後DROP
平的任何現有的PROCEDURE
的版本)開始。此PROCEDURE
將傳遞給它的名稱(例如'Edgar Allan Poe'
)存儲在參數變量authorFullName
中。
一旦開始,PROCEDURE
首先將字符串(如Edgar Allan Poe
)轉換爲'Edgar', 'Allan', 'Poe'
並將其存儲在變量@authorFullNameCommad
中。
然後使用CONCAT()
函數來形成將生成我們的結果的SQL語句的文本。其中authorFullName
是Edgar Allan Poe
下面的語句生成並存儲在@selectStatementString
...
SELECT authorID,
firstName,
middleName,
lastName
FROM author
WHERE ((firstName IN ('Edgar', 'Allan', 'Poe')) + (middleName IN ('Edgar', 'Allan', 'Poe')) + (lastName IN ('Edgar', 'Allan', 'Poe'))) >=2;
的SQL語句然後PREPARE
d和EXECUTE
d,從而產生當PROCEDURE
被稱爲所需的列表,這可以用做...
CALL SimilarNames('Edgar Allan Poe');
請注意,你不這樣做必須在第一次申報後申報PROCEDURE
。即下面的工作就好了... ...
CALL SimilarNames('Edgar Allan Poe');
CALL SimilarNames('James Tiberius Kirk');
而且,請注意,這個特殊的方法是容易SQL注入。如果你願意的話,我可以開發一個防止這種情況的版本 - 現在只是晚了,我很快就會睡覺。
我的發言是針對使用下面的腳本創建了一個樣本數據集測試...
CREATE TABLE author
(
authorID INT NOT NULL AUTO_INCREMENT,
firstName VARCHAR(50),
middleName VARCHAR(50),
lastName VARCHAR(50),
PRIMARY KEY (authorID)
);
INSERT INTO author (firstName,
middleName,
lastName)
VALUES ('Edgar', 'Allan', 'Poe'),
('Poe', 'Allan', 'Edgar'),
('Edgar', 'Poe', ''),
('Edgar', '', 'Poe'),
('', 'Edgar', 'Poe'),
('Allan', 'Poe', ''),
('Edgar', 'Allan', ''),
('Allan', 'Edgar', 'Poe'),
('Edgar', 'Allan', 'Allan'),
('James', 'Tiberius', 'Kirk'),
('Karl', 'Ignatius', 'von Bach'),
('Edgar', 'Poe', 'xyz'),
('Allanah', 'Poelsen', '');
的結果如我所料。
如果您有任何問題或意見,請隨時發佈相應評論。
進一步閱讀
https://dev.mysql.com/doc/refman/5.7/en/call.html(對MySQL的CALL
語句)
https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat(對MySQL的CONCAT()
功能)
https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html(對MySQL的CREATE PROCEDURE
語句)
https://dev.mysql.com/doc/refman/5.7/en/deallocate-prepare.html(對MySQL的DEALLOCATE
STA tement)
https://dev.mysql.com/doc/refman/5.7/en/stored-programs-defining.html(對MySQL的DELIMITER
命令)
https://dev.mysql.com/doc/refman/5.7/en/drop-procedure.html(對MySQL的DROP PROCEDURE
語句)
https://dev.mysql.com/doc/refman/5.7/en/execute.html(對MySQL的EXECUTE
語句)
https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in(對MySQL的IN
運營商)
https://dev.mysql.com/doc/refman/5.7/en/prepare.html(在MySQL的PREPARE
sta tement)
https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_replace(對MySQL的REPLACE()
功能)
https://dev.mysql.com/doc/refman/5.7/en/set-statement.html(對MySQL的SET
語句)
編輯你的問題,標籤與你所使用的數據庫的數據庫。 –
_all_組合是否可以接受? – Manngo
@Manngo是的,所有的組合都可以接受。 – Xty83a