【发布时间】:2020-10-21 04:48:30
【问题描述】:
我已经搜索了一下,但找不到关于此的具体问题。如何获取名称包含特定字符串的表中的所有列名?具体来说,如果列名满足like %bal%,那么我想编写一个查询,该查询将返回该列名以及其他符合 Sybase 标准的列名。
编辑:Sybase RDBMS 是 Sybase IQ。
【问题讨论】:
-
@markp-fuso 它的 Sybase IQ。我编辑了问题
标签: sap-iq
我已经搜索了一下,但找不到关于此的具体问题。如何获取名称包含特定字符串的表中的所有列名?具体来说,如果列名满足like %bal%,那么我想编写一个查询,该查询将返回该列名以及其他符合 Sybase 标准的列名。
编辑:Sybase RDBMS 是 Sybase IQ。
【问题讨论】:
标签: sap-iq
根据 OP 更新了附加 cmets re:问题是针对 Sybase IQ 数据库的。
目前我面前没有 Sybase IQ 数据库,但我们应该能够根据 IQ 的系统表/视图拼凑出一个可行的查询:
更简单的查询将使用系统视图SYSCOLUMNS:
select cname
from SYS.SYSCOLUMNS
where tname = '<table_name>'
and cname like '%<pattern_to_match>%'
或者对系统表SYSTABLE和SYSCOLUMN:
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) 系统表(sysobjects、syscolumns)也存在于 SQL Anywhere/IQ 产品中,因此 Sybase ASE 查询(如下)可能也会起作用。 (部分)尝试提供 (ASE) T-SQL 兼容性。
假设这是 Sybase ASE,那么 sysobjects 和 syscolumns 之间的快速连接就足够了:
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
【讨论】:
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 的列。这有什么原因吗?
syscolumns 导致错误 Sybase Database Error: Table name 'syscolumns' is ambiguous
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 子句,然后验证列的拼写/大写