【问题标题】:How can I get all column names matching a given string in Sybase?如何在 Sybase 中获取与给定字符串匹配的所有列名?
【发布时间】:2020-10-21 04:48:30
【问题描述】:

我已经搜索了一下,但找不到关于此的具体问题。如何获取名称包含特定字符串的表中的所有列名?具体来说,如果列名满足like %bal%,那么我想编写一个查询,该查询将返回该列名以及其他符合 Sybase 标准的列名。

编辑:Sybase RDBMS 是 Sybase IQ。

【问题讨论】:

  • @markp-fuso 它的 Sybase IQ。我编辑了问题

标签: sap-iq


【解决方案1】:

根据 OP 更新了附加 cmets re:问题是针对 Sybase IQ 数据库的。


目前我面前没有 Sybase IQ 数据库,但我们应该能够根据 IQ 的系统表/视图拼凑出一个可行的查询:

更简单的查询将使用系统视图SYSCOLUMNS

select  cname
from    SYS.SYSCOLUMNS
where   tname = '<table_name>'
and     cname like '%<pattern_to_match>%'

或者对系统表SYSTABLESYSCOLUMN

select  c.column_name
from    SYS.SYSTABLE t
join    SYS.SYSCOLUMN c
on      t.table_id = c.table_id
where   t.table_name = '<table_name>'
and     c.column_name like '%<pattern_to_match>%'

注意:由于引用的 (ASE) 系统表(sysobjectssyscolumns)也存在于 SQL Anywhere/IQ 产品中,因此 Sybase ASE 查询(如下)可能也会起作用。 (部分)尝试提供 (ASE) T-SQL 兼容性。


假设这是 Sybase ASE,那么 sysobjectssyscolumns 之间的快速连接就足够了:

select  c.name
from    dbo.sysobjects o
join    dbo.syscolumns c
on      o.id = c.id
and     o.type in ('U','S')            -- 'U'ser or 'S'ystem table
where   o.name = '<table_name>'
and     c.name like '%<portion_of_column_name>%'

例如,假设我们要查找sysobjects 表中列名包含字符串'trig' 的所有列:

select  c.name
from    dbo.sysobjects o
join    dbo.syscolumns c
on      o.id = c.id
and     o.type in ('U','S')
where   o.name = 'sysobjects'
and     c.name like '%trig%'
order by 1
go

 ----------
 deltrig
 instrig
 seltrig
 updtrig

【讨论】:

  • @markp_fuso 谢谢。当我尝试您列出的前两个查询时,例如select c.column_name from SYS.SYSTABLE t join SYS.SYSCOLUMN c on t.table_id = c.table_id where t.table_name = 'employees' and c.column_name like '%income%',我没有收到任何结果。但是,我知道表employees 有一个名为income 的列。这有什么原因吗?
  • 而查询 3 和 4 中的 syscolumns 导致错误 Sybase Database Error: Table name 'syscolumns' is ambiguous
  • re:第一条评论(employees/income == 0 行),我想知道 IQ(和 SQLAnywhere)是否将 SYSCOLUMN 中的表名大写(类似于 Oracle 所做的)?如果你运行select table_name from SYS.SYSTABLE order by 1,你会得到什么?你看到employee 还是EMPLOYEE?;回复:第二条评论(syscolumns == 模棱两可)...啊,是的,看起来像 2 个同名的表/视图 syscolumns == SYSCOLUMNS 所以需要与所有者进行序言;根据文档,我猜 T-SQL 兼容性syscolumns 的所有者是dbo - 我已经相应地更新了问题 - 试试看?
  • 元数据必须在其中,所以我会尝试...select creator,tname from SYS.SYSCOLUMNS order by 2,1 并查看列表以验证创建者和表名的拼写/大写;找到所需记录后,将 cname 添加到选择/项目列表并为所需行添加 where 子句,然后验证列的拼写/大写
猜你喜欢
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2021-08-30
  • 2019-05-10
相关资源
最近更新 更多