sql查询相同字段 使用mysql中具有单个关键字的单个where条件搜索表的所有列




sql查询相同字段 (8)

你可以使用带有OR多个条件的where

喜欢

where
name = 'expected'
OR rate ='expected' 
OR country ='expected'

https://code.i-harness.com

我有一个由64个不同领域组成的表。 我将在其中搜索一个关键字,结果应与任何字段中的关键字匹配。 提出一些建议。


另一种可能性是使用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%'

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


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

WHERE
name = @keyword OR
country = @keyword OR
department = @keyword OR
@keyword IS NULL -- match all when search text is empty

您可以使用动态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);
    PREPARE stmt FROM CONCAT('SELECT * FROM `', inDB, '`.`', inTable, '` WHERE ', @matches);
    EXECUTE stmt;
END
$$
CALL searchAllCols('table_to_search', 'searchString');

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

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

希望有所帮助。 :-)


我看不到你的查询方式很简单但很长:

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

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

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


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

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

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

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

有一些谷歌搜索,

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

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


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

瞧。

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

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





search