【问题标题】:Search in every column在每一列中搜索
【发布时间】:2011-02-11 09:14:16
【问题描述】:

我正在构建一个抽象的宝石。我需要一个看起来像这样的 sql 查询

SELECT * FROM my_table WHERE * LIKE '%my_search%'

这可能吗?

编辑: 我不关心查询性能,因为它是管理面板的一项功能,每月使用一次。我也不知道表格有哪些列,因为它太抽象了。当然我可以使用一些 Rails ActiveRecord 函数来查找所有列,但我希望避免添加这个逻辑而只使用 *.这将是一个宝石,我不知道它将与它一起使用什么数据库。也许这里有一个性感的 rails 功能可以帮助我。

【问题讨论】:

  • 请注意 - 如果您使用诸如 LIKE '%term%' 之类的表达式,您基本上会阻止查询优化器使用任何类型的索引。您每次都会得到全表扫描。在性能方面不是很好。要在多列中搜索单词,请使用 全文搜索
  • “我不关心查询性能”+“防止查询优化器使用任何类型的索引。” => 可能会使系统崩溃,或者至少使用其所有资源的时间过长,并阻止任何其他可能对业务至关重要的查询。 (一旦我公司的服务器崩溃,必须重新启动一个糟糕的脏查询,禁止工人每次工作 15 分钟)。关心性能:)
  • 我的解决方案对您有用吗?我好奇!请告诉我们!
  • pastebin.com/raw.php?i=7nuF5gLY 是的,感谢我现在使用此代码,它足以在抽象管理面板中进行默认搜索

标签: sql ruby-on-rails


【解决方案1】:

据我了解,基本上您正在尝试构建一个 sql 语句,该语句应检查该表中所有列的条件。一个肮脏的黑客,但这会生成所需的 Sql。

condition_string = MyTable.column_names.join(' LIKE ? OR ')
MyTable.all(:conditions => [condition_string, '%my_search%'])

但是,这未经测试。这可能有效。

【讨论】:

  • 实际上这失败了。它需要搜索词重复 MyTable.column_names.size 次!
  • 嗨@antpaw,@Sam 的方法应该更有效:D .. 试一试,让我们知道
【解决方案2】:

* LIKE '...' 根据 SQL 标准无效,并且不受我所知道的任何 RDBMS 的支持。您可以尝试使用CONCAT 之类的函数来生成LIKE 的左参数,尽管性能不会很好。至于SELECT *,一般是要避免的。

【讨论】:

  • 我认为这不是他主要关心的问题,他想知道是否允许在 SQL 中执行where * 之类的操作(即where col1 = somecondition or col2 = somecondition or col3 = ...
【解决方案3】:

不,SQL 不支持该语法。

要搜索所有列,您需要使用过程或动态 SQL。这是另一个可能有帮助的 SO 问题:

SQL: search for a string in every varchar column in a database

编辑:抱歉,我链接到的问题是寻找字段名称,而不是数据,但它可能会帮助您编写一些动态 SQL 来构建您需要的查询。

您没有说明您使用的是哪个数据库,因为可能有供应商特定的解决方案。

【讨论】:

    【解决方案4】:

    这只是一个想法,但我认为它值得测试!

    这取决于您的数据库,您可以获得表的所有列,例如在 MSSQL 中,您可以使用以下方式:

    select name from syscolumns where id=object_id('Tablename')
    

    Oracle 下猜是这样的:

    select column_name from USER_TAB_COLUMNS where TABLE_NAME = 'Tablename'
    

    然后您将必须使用一个程序和一个游标遍历这些列,以便您可以检查每个列是否有您搜索的数据:

    if ((select count(*) from Tablename where Colname = 'searchingdata') > 0) 
    then keep the results in a separated table(ColnameWhereFound, RecNrWhereFound).
    

    如果您尝试将字符串与数字进行比较,Datatye 的问题可能是一个问题,但是如果您注意到例如在 SQL-Server 下,syscolumns 表包含一个名为“usertype”的列,其中包含一个数字似乎是指数据类型存储在 Columne 中,比如 2 表示字符串,7 表示 int,2 表示 smallint,猜测 Oracle 也会有类似的东西。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2015-01-03
      • 1970-01-01
      相关资源
      最近更新 更多