我正在构建一个抽象的宝石。我需要一个看起来像这样的SQL查询
SELECT * FROM my_table WHERE * LIKE '%my_search%'
可能吗?
编辑: 我不关心查询性能,因为它是管理面板的功能,每月使用一次。我也不知道表中有哪些列,因为它是如此抽象。当然我可以使用一些rails ActiveRecord函数来查找所有列但我希望避免添加此逻辑并只使用*。它将成为一个宝石,我不知道将与它一起使用什么数据库。也许有一个性感的导轨功能可以帮助我在这里。
答案 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也会有类似的东西。
希望这有帮助。