Mysql查询在表的所有列中搜索字符串

时间:2013-07-27 12:58:22

标签: mysql sql

我想知道如何将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%'

4 个答案:

答案 0 :(得分:1)

试试这个

   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%"

答案 1 :(得分: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

答案 2 :(得分:1)

以下是如何在动态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;

还测试了(; - )。

答案 3 :(得分:1)

您可以使用此商店过程搜索表

中所有列中的文本
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'