如何搜索表格中的所有列?

时间:2011-10-27 21:36:14

标签: sql sql-server sql-server-2008 sql-server-2008-r2

如何在SQL Server中搜索表的所有列?

6 个答案:

答案 0 :(得分:17)

SELECT ...
FROM yourtable
WHERE 'val' IN (field1, field2, field3, field4, ...)

如果您正在寻找确切的全场比赛。如果你正在寻找子串匹配,你将不得不走很长的路:

WHERE field1 LIKE '%val%' or field2 LIKE '%val%' etc....

答案 1 :(得分:3)

您甚至可以通过这种方式进行操作。动态创建查询。

SET NOCOUNT ON;

DECLARE @searchText NVARCHAR(100) = 'Test'
DECLARE @columnName NVARCHAR(100)
DECLARE @tableName NVARCHAR(100) = 'Accounts'
DECLARE @sql NVARCHAR(1000) = 'SELECT * FROM ' + @tableName +' WHERE '

DECLARE columns CURSOR FOR
SELECT sys.columns.name FROM sys.tables
INNER JOIN sys.columns ON sys.columns.object_id = sys.tables.object_id
WHERE sys.tables.name = @tableName

OPEN columns
FETCH NEXT FROM columns
INTO @columnName

WHILE @@FETCH_STATUS = 0

BEGIN

    SET @sql = @sql + @columnName + ' LIKE ''%' + @searchText + '%'' OR '
    FETCH NEXT FROM columns
    INTO @columnName    

END

CLOSE columns;    
DEALLOCATE columns;

SET @sql = LEFT(RTRIM(@sql), LEN(@sql) - 2)

EXEC(@sql)

答案 2 :(得分:2)

我不相信有任何快捷方式,您必须指定要搜索的列的列表。我认为,如果你发现自己试图做很多,你可能会改进数据库设计。

SELECT * 
FROM MyTable 
WHERE Col1 LIKE '%foo%' OR 
      Col2 LIKE '%foo%' OR  
      Col3 LIKE '%foo%' OR 
      Col4 LIKE '%foo%' OR 
      Col5 LIKE '%foo%' OR 
      Col6 LIKE '%foo%'

答案 3 :(得分:1)

我不能相信,但是我发现了这一点,并且效果很好。您可以根据需要在WHERE子句中添加其他数据类型以包括其他类型,也可以在JOIN中添加模式名称(如下所述)以限制搜索。

DECLARE @SQL VARCHAR(MAX) 
DECLARE @SearchString VARCHAR(100) 
SET @SQL='' 

-- ------------------------------------------ 
-- Enter the string to be searched for here : 
SET @SearchString='' 
-- ------------------------------------------ 

SELECT   @SQL = @SQL + 'SELECT CONVERT(VARCHAR(MAX),COUNT(*)) + '' matches in column ''+'''
     + C.name + '''+'' on table '' + ''' + SC.name + '.' + T.name + 
     ''' [Matches for '''+@SearchString+''':] FROM ' + 
     QUOTENAME(SC.name) + '.' + QUOTENAME(T.name) + ' WHERE ' + QUOTENAME(C.name) + 
     ' LIKE ''%' + @SearchString + 
     '%'' HAVING COUNT(*)>0 UNION ALL ' +CHAR(13) + CHAR(10) 

FROM     sys.columns C 
JOIN     sys.tables T ON C.object_id=T.object_id 
JOIN     sys.schemas SC ON SC.schema_id=T.schema_id -- AND SC.name = ''
JOIN     sys.types ST ON C.user_type_id=ST.user_type_id 
JOIN     sys.types SYST ON ST.system_type_id=SYST.user_type_id
    AND ST.system_type_id=SYST.system_type_id 

WHERE    SYST.name IN ('varchar','nvarchar','text','ntext','char','nchar') 

ORDER BY T.name, C.name 

-- Strip off the last UNION ALL 

IF LEN(@SQL)>12 
  SELECT @SQL=LEFT(@SQL,LEN(@SQL)- 12) 

EXEC(@SQL) 
--PRINT @SQL

参考: https://www.sqlmatters.com/Articles/Searching%20all%20columns%20in%20all%20tables%20in%20a%20database.aspx

答案 4 :(得分:1)

使用子查询阅读Jose Hernandez Naranjo的答案后,我找到了一种快速的方法。这样的好处是我们不必在数据库中添加额外的列。

让我们假设有一个表人员,其列PersonID,Firstname,Name,Cellphone,Email和Place,都应进行搜索,而包括Place的全名应输出。该代码将看起来如下所示:

SELECT Firstname, Name, Place 
FROM person NATURAL JOIN 
  (SELECT PersonID, CONCAT(Firstname, ' ', Name, ' ', Cellphone, ' ',
   Email, ' ', Place) search_string FROM person) as all_in_one
WHERE search_string LIKE '%Hans%' AND search_string LIKE '%Muster%'

如果您正在使用其他语言(如PHP)的SQL,则可以使用循环将其添加到WHERE后面。这是PHP的示例:

$q = $_GET['q'];
$words = explode(" ", $q);
foreach($words as $word){
  if(is_null($search_query)){
     $search_query = "search_string LIKE '%$word%'";
  }else{
     $search_query .= " AND search_string LIKE '%$word%'";
  }     
}

(注意:此示例不检查可能用于SQL注入的GET变量。)

答案 5 :(得分:0)

我之前在一个项目中这样做过。搜索SQL中所有列的最佳方法是在表中创建一个新列,并将每个列的文本/数据粘贴到表中,如下所示:

表:
| ------------------------------------------------- -|
|第1列|第2列| search_column |
| ------------------------------------------------- -|
| fooxxxxx | barxxxx | fooxxxxx barxxxx |
-------------------------------------------------- -|

SELECT search_column FROM table1 Like%key word%

它可以工作,并且无需编写大量SQL代码即可完成工作。运行这种类型的查询也要快得多。唯一的缺点是在更新和创建表时必须构造search_column。