请尝试以下...
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