在Informix表中搜索所有列以获取值

时间:2010-12-01 19:39:44

标签: sql search informix

我是Informix的新手,但请记住使用SQL Server执行此操作。基本上我想查询给定表中的所有列的指定值。

我用Google搜索的所有内容都引用了SQL服务器。

想法?

2 个答案:

答案 0 :(得分:2)

没有内置的方法可以做到这一点。你必须这样做:

SELECT * FROM Table WHERE Column1 = <your-value>
UNION
SELECT * FROM Table WHERE Column2 = <your-value>
UNION
...

自动生成查询

  

是否有编程方式来生成大量UNION-SELECT语句?我的一些目标表有很多列。

你选择的武器是什么?那个数据库名称,表名和值是什么? 我选择的武器是SQLCMD,该程序可以从IIUG Software Archive获得,而不是微软的johnny - 最近创建的同名。

dbname=stores
table=customers
value=Raymond

sqlcmd -D'\n' -d $dbname -e \
    "select 'SELECT * FROM $table WHERE ', c.colname,
            '::VARCHAR(64) = ''$value''', 'UNION'
       from informix.syscolumns as c
       join informix.systables as t on t.tabid = c.tabid
      where t.tabname = '$table' order by colno" |
sed '$d'

输出查询关键字为大写;生成它的元查询是小写的。元查询是使用SysColumns连接SysTables。 “-D '\n'”选项表示“字段分隔符是换行符”(以及记录分隔符)。我确保UNION在它自己的一行上,以便轻松删除最后一个。我将列转换为VARCHAR(64),以便无论源类型如何都可以将它们与字符串进行比较 - 几乎与源类型无关,因为BYTE,TEXT,BLOB和CLOB列不会转换。如果您需要LIKE '%Raymond%'谓词,请相应地调整查询。

使用Perl和DBI以及DBD :: Informix可以获得类似的结果。

使用DB-Access获取输出会很麻烦;您可能会使用内置的“OUTPUT TO "/dev/stdout" WITHOUT HEADINGS select ...”,其中...是上面显示的查询的其余部分。然后你必须摆脱输出的最后两行,这比最后一行要困难得多。可能最简单的是蛮力 - 在输出上运行两个sed '$d'副本,但解决方案不能很好地扩展。如果失败,请将输出保存在文件中,并使用edex进行编辑。

示例输出:

SELECT * FROM customer WHERE
customer_num
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
fname
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
lname
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
company
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
address1
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
address2
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
city
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
state
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
zipcode
::VARCHAR(64) = 'Raymond'
UNION
SELECT * FROM customer WHERE
phone
::VARCHAR(64) = 'Raymond'

当上面的输出被送入SQLCMD的第二个副本时,它产生了输出:

 105|Raymond|Vector|Los Altos Sports|1899 La Loma Drive||Los Altos|CA|94022|415-776-3249

答案 1 :(得分:0)

如果您想获得表格已确定的列,请执行&gt;&gt;

select t.tabname from systables t where t.tabid in ( 
    select tabid from syscolumns c where c.colname = 'NAME_OF_THE_COLUMN')

[]中 ALF