【发布时间】:2010-12-01 19:39:43
【问题描述】:
我是 Informix 的新手,但请记住使用 SQL Server 执行此操作。基本上我想查询给定表中的所有列以获取指定值。
我在 Google 上搜索到的所有内容都参考了在 SQL Server 中执行的操作。
想法?
【问题讨论】:
我是 Informix 的新手,但请记住使用 SQL Server 执行此操作。基本上我想查询给定表中的所有列以获取指定值。
我在 Google 上搜索到的所有内容都参考了在 SQL Server 中执行的操作。
想法?
【问题讨论】:
没有内置的方法可以做到这一点。你必须这样做:
SELECT * FROM Table WHERE Column1 = <your-value>
UNION
SELECT * FROM Table WHERE Column2 = <your-value>
UNION
...
是否有一种编程方式来生成大量 UNION-SELECT 语句?我的一些目标表有很多列。
你选择的武器是什么?该数据库名称、表名称和值是什么? 我选择的武器是 SQLCMD,该程序可从IIUG Software Archive 获得,而不是 Microsoft 的 johnny-come-lately 创建的同名。
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' 的两个副本,但解决方案不能很好地扩展。如果失败,请将输出保存在文件中并使用ed 或ex 对其进行编辑。
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
【讨论】:
如果您想获取哪些表已确定列,请执行此操作>>
select t.tabname from systables t where t.tabid in (
select tabid from syscolumns c where c.colname = 'NAME_OF_THE_COLUMN')
[]s 阿尔夫
【讨论】: