【问题标题】:SQL query to return all rows where one or more of the fields contains a certain valueSQL查询返回一个或多个字段包含特定值的所有行
【发布时间】:2009-01-22 21:30:36
【问题描述】:

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

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

【问题讨论】:

  • 我发誓我昨天看到了这个问题,但我找不到。
  • 给我们更多信息。展开您的问题,只需单击编辑并执行此操作。 ;)

标签: sql


【解决方案1】:

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

【讨论】:

  • +1 - 我可以想象你可能在不止一列中具有相同值的情况,但你是对的:它闻起来像糟糕的设计。当然,当问题如此基本时,这种风险就更高了。
  • 此处的代码异味表明 rmeador 指出的内容...您的数据库是否针对您正在使用的内容进行结构化?
  • 我有时必须对具有大量字段的大型机系统运行查询,其中字段名称是随机的八个字符串。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我认为您需要列出 where 子句中的所有列。不过,我离 SQL 向导还很远……也许其他人知道方法。

    【讨论】:

      【解决方案4】:

      你必须写出来

      【讨论】:

        【解决方案5】:

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

        如果您添加您正在使用的编程语言以及您在什么类型的环境中工作,我们可以为您提供如何动态执行此操作的线索或解决方案。

        我认为您的问题实际上是如何根据您的程序用户在“搜索”表单中填写的内容动态地执行此操作。我对吗?

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

        【讨论】:

          猜你喜欢
          • 2014-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-23
          • 1970-01-01
          • 2021-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多