搜索每一列

时间:2011-02-11 09:14:16

标签: sql ruby-on-rails

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

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

可能吗?

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

4 个答案:

答案 0 :(得分:2)

我理解这个问题,基本上你是在尝试构建一个sql语句,该语句应检查该表中所有列的条件。一个脏黑客,但这会生成所需的Sql。

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

但是,这没有经过测试。这可能有用。

答案 1 :(得分:1)

* LIKE '...'根据SQL标准无效,并且我不知道任何RDBMS都不支持。您可以尝试使用CONCAT这样的函数来生成LIKE的左参数,但性能不会很好。至于SELECT *,通常需要避免的事情。

答案 2 :(得分:0)

不,SQL不支持该语法。

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

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

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

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

答案 3 :(得分:0)

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

这取决于您的数据库,您可以获取表的所有列,例如在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也会有类似的东西。

希望这有帮助。