【问题标题】:How to search about a specific value in all columns in the table?如何在表的所有列中搜索特定值?
【发布时间】:2015-07-29 13:34:44
【问题描述】:

我有一个表 (students_all),其中包含 4 列,如下所示:-

  • 学生姓名
  • 年龄
  • student_id

现在如何使用 SQL Server 2008 在一个查询的所有列中搜索特定值,例如 'left'

我的意思是如何让 Excel (Ctrl+F) 之类的东西在所有列中找到任何值。

【问题讨论】:

  • 首先您需要标记 SQL Server 而不是 MySQL。它们不一样。其次,您需要更具体地了解您需要如何查询您的表。 excel中没有像ctrl + f这样的东西。
  • SELECT * WHERE column1 = 'left' OR column2 = 'left' OR ...
  • SQL 都是关于 结构化 数据的 - 其中每列中的(隐含)数据类型是不同的。因此,没有多少工具可以帮助查询列(因为这样的比较通常是没有意义的)。您对 Excel 的引用可能在这里说明了问题 - 尽管表面上相似,但 SQL 中的表与 Excel 中的工作表完全不同。如果您发现自己难以完成在 Excel 中可以轻松完成的事情,那么您可能选择了错误的工具来完成这项工作?

标签: sql sql-server sql-server-2008 search


【解决方案1】:

修改 @shA.t's answer 以允许包含空格的列名。

DECLARE @TableName nvarchar(256) = 'TableName';
DECLARE @Find nvarchar(50) = 'SearchText';

DECLARE @sql nvarchar(max) = '';

SELECT @sql = @sql +
    CASE 
        WHEN @sql = '' THEN ''
        ELSE ' OR '
    END + '[' + cols.COLUMN_NAME +']' + ' LIKE ''%' + @Find +'%'''
FROM INFORMATION_SCHEMA.COLUMNS cols
WHERE cols.TABLE_NAME = @TableName;

select @sql = 'SELECT * FROM ' + @TableName + ' WHERE ' + @sql 
execute(@sql)

【讨论】:

    【解决方案2】:
    SELECT *
    FROM students_all
    WHERE  'left' in (student_name , age ,student_id , class);
    

    它将为您提供 Left 所在的行

    【讨论】:

      【解决方案3】:

      有很多方法可以检查在一个特殊表的 SQL 中找到类似的东西,所以我建议这样:

      SELECT *
      FROM students_all
      WHERE student_name + age + student_id + class LIKE '%left%';
      

      但是对于我使用这个的动态方式:

      DECLARE @TableName nvarchar(256) = 'Table_1';
      DECLARE @Find nvarchar(50) = '1';
      
      DECLARE @sql nvarchar(max) = '';
      
      SELECT @sql = @sql + 
          CASE 
              WHEN @sql = '' THEN ''
              ELSE '+ '
          END + 'CONVERT(nvarchar(max), ISNULL(' + cols.COLUMN_NAME + ', '''')) COLLATE DATABASE_DEFAULT '
      FROM INFORMATION_SCHEMA.COLUMNS cols
      WHERE cols.TABLE_NAME = @TableName;
      
      SELECT @sql = 'SELECT * FROM ' + @TableName + ' WHERE ' + @sql + ' LIKE ''%' + @Find + '%''';
      
      -- Or if you want to add other field types you can use this instead:
      --SELECT @sql = 'SELECT * FROM ' + @TableName + ' WHERE CAST(' + @sql + ' AS NVARCHAR(MAX)) LIKE ''%' + @Find + '%''';
      
      EXEC(@sql);
      

      【讨论】:

      • 这对于 DataType INT 或 Numeric 的列会失败
      【解决方案4】:

      我认为这 earlier post 是 OP 试图提及的。 但是,它需要修改才能仅从 1 个特定表中搜索。

      【讨论】:

        【解决方案5】:
        SELECT * FROM students_all as std
        WHERE 
        std.student_name = 'left'
        OR std.age = 'left'
        OR std.student_id = 'left'
        OR std.class = 'left'
        

        【讨论】:

          【解决方案6】:

          我的理解是你想要在表格的任何一列中具有值 left 的数据

          你可以使用

          SELECT *
          FROM students_all
          WHERE 
                student_name == 'left'
                OR age == 'left'
                OR student_id == 'left'
                OR class == 'left'
          

          这将检查为您提供至少一列值为left 的行


          但我想获取包含单词left 的数据,您需要将WHERE 中的所有条件更改为COLULMN_NAME LIKE %left%

          希望这会有所帮助。

          【讨论】:

            【解决方案7】:
            select * from students_all where left (
                student_name
                age
                student_id
                class
            

            如果所有列都是字符串类型

            【讨论】:

              【解决方案8】:
              SELECT *
              FROM students_all as t
              WHERE t.student_name == 'left'
                    OR t.age == 'left'
                    OR t.student_id == 'left'
                    OR t.class == 'left'
              

              没有一种“快速”的方法来一次检查每一列,您需要逐列检查每一列!

              【讨论】:

              • 感谢您的回复,我找到了这个查询 SELECT * FROM [Table Name] WHERE CONTAINS(*, 'value');但它需要创建全文目录和全文搜索
              猜你喜欢
              • 2016-10-26
              • 2021-09-16
              • 2010-12-20
              • 2018-12-23
              • 2017-07-04
              • 2018-03-17
              相关资源
              最近更新 更多