在mysql中使用带有单个关键字的单个where条件搜索表的所有列
Posted
技术标签:
【中文标题】在mysql中使用带有单个关键字的单个where条件搜索表的所有列【英文标题】:Search all columns of a table using a single where condition with single keyword in mysql 【发布时间】:2012-09-15 01:08:05 【问题描述】:我有一个包含 64 个不同字段的表。我将在其中使用单个关键字进行搜索,结果应与任何字段中的关键字匹配。提出一些建议。
【问题讨论】:
不要忘记点击对勾并为对您有帮助的答案投票。 ^我完全同意并且有类似的想法:) 从 *where *like %search_text% 中选择 *。这可能吗??? 您需要执行此类查询的事实表明您的架构存在问题。如果所有字段都包含相同类型的数据,则它们可能应该是表的行,而不是列。 @Barmar 我将野生 CSV 文件导入系统中的暂存表中,有时需要搜索暂存表中的多个字段以确定属于我的核心数据表中单个字段的事实( s)。 【参考方案1】:您可以使用动态 SQL 生成并执行搜索所有列的查询。
DELIMITER $$
CREATE PROCEDURE searchAllCols(inDB VARCHAR(64), inTable VARCHAR(64), search VARCHAR(32))
BEGIN
SET @matches = (
SELECT GROUP_CONCAT(CONCAT('`', COLUMN_NAME, '` LIKE "%', search, '%"') SEPARATOR ' OR ')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = inTable and table_schema = inDB);
SET @query = CONCAT('SELECT * FROM `', inDB, '`.`', inTable, '` WHERE ', @matches);
PREPARE stmt FROM @query;
EXECUTE stmt;
END
$$
DELIMITER ;
CALL searchAllCols('table_to_search', 'searchString');
【讨论】:
非常有趣的方法。不幸的是,我得到一个 ERROR 1064 (42000): You have an error in your SQL syntax;检查与您的 mysql 服务器版本相对应的手册,以在 'CONCAT('SELECT * FROM', inDB, '
.', inTable, '
WHERE ', @matches); 附近使用正确的语法;
您忘记将分隔符重置为“;”,最后一行不会执行。
解决问题的方法是在准备语句之前将CONCAT
查询放在单独的行上:SET @query = CONCAT('SELECT * FROM
', inDB, '.
', inTable, '` WHERE ', @matches );. Then we can do
PREPARE stmt FROM @query;`.它以这种方式工作。【参考方案2】:
另一种可能性是使用 FOR XML 将所有列打印到单个字段...像这样:
SELECT c.*
FROM (
SELECT a.*
,( SELECT *
FROM table_to_search b
WHERE a.KeyField = b.KeyField
FOR XML RAW) AS `Full_Text_Record`
FROM table_to_search a) c
WHERE c.`Full_Text_Record` LIKE '%Search_string%'
如果它是一个特别大的表,可能需要一段时间才能运行,但它应该会强制你找出该字符串是否存在于任何给定的表中。
【讨论】:
方括号是干什么用的?这是 MySQL,而不是 SQL-Server。FOR XML RAW
是 Microsoft SQL Server 主义,不受 MySQL 支持。【参考方案3】:
SELECT * FROM `some_table`
WHERE
CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
LIKE '%VT%'
瞧。
'|'顺便说一句,分隔符是为了防止您找到巧合的匹配项,例如,column1 以“V”结尾,column2 以“T”开头,这会使您在搜索“VT”时出现误报。
我不确定上述方法是否比OR
方法快(我猜它们的速度是一样的),但如果您是手动编写查询,它肯定会减少输入。
【讨论】:
【参考方案4】:您可以编写一个查询来为表中的每一列生成一个查询。 在下面的示例中,架构(“所有者”)是“DEV_USER” 包含 64 个字段的表称为“CUSTOMER_INFO” 搜索条件是其中包含“VT”值的任何列:
select 'SELECT ' || COLUMN_NAME || ' FROM CUSTOMER_INFO
WHERE ' || COLUMN_NAME || q'# LIKE '%VT%';#'
FROM ALL_TAB_COLS
WHERE OWNER = 'DEV_USER'
AND TABLE_NAME = 'CUSTOMER_INFO';
这个查询将为您生成每个字段的查询。 运行上述结果将是;
SELECT ADDRESS_1 FROM CUSTOMER_INFO
WHERE ADDRESS_1 LIKE '%VT%';
SELECT ADDRESS_2 FROM CUSTOMER_INFO
WHERE ADDRESS_2 LIKE '%VT%';
SELECT CITY FROM CUSTOMER_ADDRESSES_QASB
WHERE CITY LIKE '%VT%';
SELECT STATE_PROVINCE FROM CUSTOMER_INFO
WHERE STATE_PROVINCE LIKE '%VT%';
SELECT ZIP_POSTAL_CODE FROM CUSTOMER_INFO
WHERE ZIP_POSTAL_CODE LIKE '%VT%';
WHERE LATITUDE LIKE '%VT%';
... and so on for each column in the table
然后,您只需将第一个查询生成的查询粘贴到另一个选项卡中并运行它们。
希望对您有所帮助。 :-)
【讨论】:
效率低得令人难以置信。【参考方案5】:最简单的解决方案是使用多个ORs
。
select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";
您可以根据要求使用like
或=
,但每次添加新列时都需要更改查询。
作为替代方案,您可以使用SQLDump for that table
然后search
那个文件。
通过谷歌搜索,
看看这个项目是否有用 - http://code.google.com/p/anywhereindb/。遍及各个领域,深受好评。
尝试使用information_schema
表中的信息。查找表中的所有列。现在,尝试使用这些信息形成您的查询。
【讨论】:
【参考方案6】:您可以将 where 与多个条件一起使用 OR
喜欢
where
name = 'expected'
OR rate ='expected'
OR country ='expected'
【讨论】:
如果我使用 OR,必须使用所有 64 个字段。有没有其他解决方案..? 您是否在同一篇文章中检查了我的解决方案? @RegisteredUser 用于替代解决方案/建议(如果他对多个 OR 有疑虑)。【参考方案7】:如果你能把这个 SQL Server 语法翻译成 MySQL
WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty
【讨论】:
【参考方案8】:我看不出您的查询简单但冗长的方法:
SET @term = "Somesearch";
SELECT id, title FROM sometable WHERE
col1 LIKE '%@term%' OR
col2 LIKE '%@term%' OR
col3 LIKE '%@term%' ...;
您可以只使用特定于语言的变量,而不是使用 MySQL 变量,但为了举例,我想我会坚持使用 MySQL 本身。
“...”是您放置其他 61 列/字段的位置。
【讨论】:
这是很小的语法,但必须编写 looooooooooong 代码 :)以上是关于在mysql中使用带有单个关键字的单个where条件搜索表的所有列的主要内容,如果未能解决你的问题,请参考以下文章