【问题标题】:Search all columns in Informix table for a value在 Informix 表中的所有列中搜索值
【发布时间】:2010-12-01 19:39:43
【问题描述】:

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

我在 Google 上搜索到的所有内容都参考了在 SQL Server 中执行的操作。

想法?

【问题讨论】:

    标签: sql search informix


    【解决方案1】:

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

    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' 的两个副本,但解决方案不能很好地扩展。如果失败,请将输出保存在文件中并使用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
    

    【讨论】:

    • Jon- 是否有一种编程方式来生成大量 UNION-SELECT 语句..我的一些目标表有很多列。
    【解决方案2】:

    如果您想获取哪些表已确定列,请执行此操作>>

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

    []s 阿尔夫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 2016-10-26
      • 1970-01-01
      • 2015-03-11
      • 2016-06-15
      • 2020-08-21
      • 2015-07-29
      • 2014-02-14
      相关资源
      最近更新 更多