【问题标题】:Mysql query search a string in all columns of a tableMysql查询在表的所有列中搜索字符串
【发布时间】:2013-07-27 12:58:21
【问题描述】:

我想知道如何安装一个尽可能便携的 SQL 来查询表的所有列以查找特定短语,例如:

表格

ID | Name           | text      | Date       | Author  | Status
1  | Augusto Weiand | Test text | 2010-01-01 | Deividi | 1

查询

SELECT * 
FROM table 
WHERE columns LIKE '%augusto%2010%text%"

我没有提供足够的细节,对不起,我喜欢做一个动态 SQL,我不需要用 'AND' 或 'OR' 指定列,因为在 Postgres 中是可以做到的:

Select * 
From table 
Where table::text ~~ '%augusto%2010%text%'

【问题讨论】:

  • “便携”是什么意思?
  • 多个 MySQL 版本
  • 如果该日期字段具有 char 或 varchar 数据类型,那么您是不明智的。如果它具有日期或日期时间数据类型,则必须将其排除在此尝试之外。
  • 没问题,这是一个不幸的例子,说所有字段都是text或varchar

标签: mysql sql


【解决方案1】:

这是可行的,虽然我强烈建议您研究全文搜索以提高效率;

为了避免一一查找所有字段中的所有模式,您可以在其中连接并搜索;

SELECT *
FROM (SELECT id,CONCAT(name,'|',text,'|',date,'|',author,'|',status) txt
      FROM Table1) a
WHERE txt LIKE '%augusto%'
  AND txt LIKE '%2010%'
  AND txt LIKE '%text%';

请注意,此处没有索引会对您有所帮助,因为您在计算列中进行搜索。另一方面,由于您使用前导通配符%searchterm 进行搜索,因此即使逐字段搜索,您也不会从索引中获得太多帮助:)

An SQLfiddle to test with.

【讨论】:

  • 谢谢,但我确实做了一个更动态的 SQL,就像 postgres 中的例子一样...... :)
【解决方案2】:

以下是在动态 SQL 中连接值的方法:

set @Pattern = '%augusto%';

select @q := concat('select * from Table1 ',
                   'where concat(', group_concat(column_name), ', "") like "', @Pattern, '"'
                   )
from information_schema.columns c
where table_name = 'Table1';

prepare st from @q;
execute st;

deallocate prepare st;

当然,动态 SQL 并不是特别便携。这个想法适用于大多数数据库。代码看起来会有所不同。

经过测试和工作here

最后,您可以使用变量替换来做到这一点(这是更好的方法):

select @q := concat('select * from Table1 ',
                   'where concat(', group_concat(column_name), ', "") like ?'
                   )
from information_schema.columns c
where table_name = 'Table1';

set @p = '%augusto%';

prepare st from @q;
execute st using @p;

deallocate prepare st;

也测试过 (;-)。

【讨论】:

  • 我测试了脚本,但不起作用.... :( 这是一个链接测试,但感谢您的回复!:sqlfiddle.com/#!2/c9cf3/1
【解决方案3】:

您可以使用此存储过程在表格的所有列中搜索文本

CREATE PROCEDURE dbo.sp_FindStringInTable @stringToFind VARCHAR(100), 
@schema 
sysname, @table sysname 
AS

BEGIN TRY
DECLARE @sqlCommand varchar(max) = 'SELECT * FROM [' + @schema + '].[' + 
@table + '] WHERE ' 

SELECT @sqlCommand = @sqlCommand + '[' + COLUMN_NAME + '] LIKE ''' + 
@stringToFind + ''' OR '
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @schema
AND TABLE_NAME = @table 
AND DATA_TYPE IN ('char','nchar','ntext','nvarchar','text','varchar')

SET @sqlCommand = left(@sqlCommand,len(@sqlCommand)-3)
EXEC (@sqlCommand)
PRINT @sqlCommand
END TRY

BEGIN CATCH 
PRINT 'There was an error. Check to make sure object exists.'
PRINT error_message()
END CATCH 

这样执行

EXEC sp_FindStringInTable '%searchword%','schema_name', 'tablename'

【讨论】:

    【解决方案4】:

    试试这个

       Select * FROM table WHERE text LIKE "%text%"
                              OR date LIKE "%2010%"
                              OR Name LIKE "%augusto%"
    

    如果你想把它们全部放在一起,那么使用 AND

       Select * FROM table WHERE text LIKE "%text%"
                              AND date LIKE "%2010%"
                              AND Name LIKE "%augusto%"
    

    【讨论】:

    • 我认为 OR 被 AND 取代
    • 谢谢,但我确实做了一个更动态的 SQL,就像 postgres 中的例子一样...... :)
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多