SQL查询返回一个或多个字段包含特定值的所有行

时间:2009-01-22 21:30:37

标签: sql

是否可以在表格上运行选择以快速查明任何(一个或多个)字段是否包含特定值?

或者您是否必须在where子句中写出所有列名?

5 个答案:

答案 0 :(得分:3)

正如其他人所说的那样,您可能需要手动或以编程方式将所有列写入WHERE子句。 SQL不包含直接执行此操作的功能。一个更好的问题可能是“为什么你需要这样做?”。需要使用此类查询可能是您的数据库不正确normalized的良好指标。如果您告诉我们您的架构,我们也可以帮助解决这个问题(如果这是一个实际问题)。

答案 1 :(得分:0)

我认为您需要列出where子句中的所有列。我远不是一个SQL向导......也许其他人都知道一种方式。

答案 2 :(得分:0)

你必须把它写出来

答案 3 :(得分:0)

当然,您必须写出要用作标准的所有列。

如果您添加了正在使用的编程语言以及您正在使用的环境类型,我们可以为您提供动态解决方案或解决方案。

我认为您的问题实际上是如何动态执行此操作,具体取决于您的程序用户在“搜索”中填写的内容...我对吗?

如果没有,那么..给我们更多信息。 ;)

答案 4 :(得分:0)

挖掘它...它将搜索数据库中的所有表,但您可以将其修改为只有一个表。

/*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'