![](/img/trans.png)
[英]SQL Query to find a group of rows having all of them a certain value in one of its fields
[英]SQL query to return all rows where one or more of the fields contains a certain value
是否可以在表上運行一次select以快速找出是否有一個 (或多個)字段包含特定值?
還是您必須在where子句中寫出所有列名?
正如其他人所說,您可能必須手動或以編程方式將所有列寫入WHERE子句。 SQL不包含直接執行此操作的功能。 一個更好的問題可能是“您為什么需要這樣做?”。 需要使用這種類型的查詢可能是一個很好的信號,表明您的數據庫沒有被正確規范化 。 如果您告訴我們您的方案,我們也可以為該問題提供幫助(如果這是實際問題)。
我認為您需要在where子句中列出所有列。 我離SQL向導還很遠……也許其他人知道一種方法。
你將不得不寫出來
當然,您必須寫出要用作條件的所有列。
如果添加您正在使用的編程語言以及在哪種類型的環境中工作,我們可以為您提供動態實現的線索或解決方案。
我認為您的問題確實是如何根據程序用戶在“搜索”表單中填寫的內容動態地執行此操作。
如果沒有,那么..給我們更多信息。 ;)
挖這個...它將搜索數據庫中的所有表,但是您可以將其修改為僅一個表。
/*This script will find any text value in the database*/
/*Output will be directed to the Messages window. Don't forget to look there!!!*/
SET NOCOUNT ON
DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64)
SET @valuetosearchfor = '%staff%' --should be formatted as a like search
SET @objectOwner = 'dbo'
DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000))
INSERT INTO @potentialcolumns (sql)
SELECT
('if exists (select 1 from [' +
[tabs].[table_schema] + '].[' +
[tabs].[table_name] +
'] (NOLOCK) where [' +
[cols].[column_name] +
'] like ''' + @valuetosearchfor + ''' ) print ''SELECT * FROM [' +
[tabs].[table_schema] + '].[' +
[tabs].[table_name] +
'] (NOLOCK) WHERE [' +
[cols].[column_name] +
'] LIKE ''''' + @valuetosearchfor + '''''' +
'''') as 'sql'
FROM information_schema.columns cols
INNER JOIN information_schema.tables tabs
ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG
AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA
AND cols.TABLE_NAME = tabs.TABLE_NAME
WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext')
AND tabs.table_schema = @objectOwner
AND tabs.TABLE_TYPE = 'BASE TABLE'
ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position
DECLARE @count int
SET @count = (SELECT MAX(id) FROM @potentialcolumns)
PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.'
PRINT 'Beginning scan...'
PRINT ''
PRINT 'These columns contain the values being searched for...'
PRINT ''
DECLARE @iterator int, @sql varchar(4000)
SET @iterator = 1
WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns)
BEGIN
SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator)
IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '')
BEGIN
--SELECT @sql --use when checking sql output
EXEC (@sql)
END
SET @iterator = @iterator + 1
END
PRINT ''
PRINT 'Scan completed'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.