23

我有一个包含 64 个不同字段的表。我将在其中使用单个关键字进行搜索,结果应与任何字段中的关键字匹配。给出一些建议。

4

8 回答 8

11
SELECT * FROM `some_table`
WHERE
CONCAT_WS('|',`column1`,`column2`,`column3`,`column4`,`column64`) # single condition, many columns
LIKE '%VT%'

瞧。

'|' 顺便说一句,分隔符是为了防止您找到巧合的匹配项,例如,column1 以“V”结尾,column2 以“T”开头,这会使您在搜索“VT”时出现误报。

我不确定上述方法是否比该OR方法更快(我猜它们的速度相同),但如果您手动编写查询,它肯定涉及更少的输入。

于 2013-12-30T06:30:38.083 回答
5

您可以将 where 与多个条件一起使用 OR

喜欢

where
name = 'expected'
OR rate ='expected' 
OR country ='expected'
于 2012-09-23T07:00:57.557 回答
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%'

如果它是一个特别大的表,可能需要一段时间才能运行,但它应该强制你找出该字符串是否存在于任何给定的表中。

于 2015-02-19T17:49:00.673 回答
2

我看不出您的查询简单但冗长的方法:

SET @term = "Somesearch";
SELECT id, title FROM sometable WHERE
    col1 LIKE '%@term%' OR
    col2 LIKE '%@term%' OR
    col3 LIKE '%@term%' ...;

您可以只使用特定于语言的变量,而不是使用 MySQL 变量,但为了举例,我想我会坚持使用 MySQL 本身。

“...”是您放置其他 61 个列/字段的位置。

于 2012-09-23T07:08:11.573 回答
1

最简单的解决方案是使用多个ORs.

select * from TAB where col1 like "%VAR%" OR col2 like "%VAR%" OR......col64 like "%VAR%";

您可以根据要求使用likeor =,但每次添加新列时都需要更改查询。

作为替代方案,您可以获取SQLDump for that table然后search该文件。

通过一些谷歌搜索,

  1. 看看这个项目是否有用 - http://code.google.com/p/anywhereindb/。搜索所有领域并受到许多人的称赞。

  2. 尝试使用information_schema表中的信息。查找表中的所有列。现在,尝试使用此信息形成您的查询。

于 2012-09-23T07:08:27.380 回答
1

如果您可以将此 SQL Server 语法转换为 MySQL

WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty
于 2012-09-23T07:09:11.317 回答
0

您可以编写一个查询,该查询将为表中的每一列生成一个查询。在下面的示例中,架构(“所有者”)是“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

然后,您只需将那些从您的第一个查询生成的查询粘贴到另一个选项卡中并运行它们。

希望有帮助。:-)

于 2013-07-10T18:08:41.953 回答
0

您可以使用动态 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');
于 2015-10-22T19:46:43.673 回答