SQL Serverでテーブルのすべての列を検索するにはどうすればよいですか?
SELECT ...
FROM yourtable
WHERE 'val' IN (field1, field2, field3, field4, ...)
フルフィールドの完全一致を探している場合。部分文字列の一致を探している場合は、長い道のりをたどる必要があります。
WHERE field1 LIKE '%val%' or field2 LIKE '%val%' etc....
この方法でも実行できます。動的にクエリを作成します。
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)
これにはショートカットがないと思います。検索する列のリストを指定する必要があります。これをたくさんやろうとしていることに気づいたら、おそらくDBの設計を改善できると思います。
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%'
私は信用できませんが、これを見つけて、それは完全に機能します。必要に応じて、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
サブクエリを使用してJoseHernandez Naranjoの回答を読んだ後、私は速い方法を見つけました。これには、データベースに列を追加する必要がないという利点があります。
PersonID、Firstname、Name、Cellphone、Email、Placeの各列を持つテーブルpersonがあり、これらはすべて検索であり、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変数のチェックは行われません。)
私は以前プロジェクトでこれを行いました。 SQLですべての列を検索する最良の方法は、テーブルに新しい列を作成し、次のように各列のテキスト/データをその列に貼り付けることです。
テーブル:
| -------------------------------------------- ------- |
| column1 | column2 | search_column |
| -------------------------------------------- ------- |
| fooxxxxx | barxxxx | fooxxxxx barxxxx |
--------------------------------------------- ------- |
SELECT search_column FROM table1 LIKE%key Word%
それは機能し、多くのSQLコードを書かなくても仕事を成し遂げます。このタイプのクエリを実行する方がはるかに高速です。唯一の欠点は、テーブルが更新および作成されるときに、search_columnを作成する必要があることです。