首页 > 解决方案 > 按编号选择列

问题描述

如何使用其编号选择表格的列?例如:

Select col:1, col:2
From Banks

代替

Select Id, Name
From Banks

我有这样的问题 - 我有在数据库中选择查询的列表,但第一列和第二列有不同的名称/别名

我想用一个参数过滤它们:

Select Id, Name
From Banks
Where lower(Name) like lower(''%' + p_bank_name + '%'')'

那么,我该如何编写这段代码:

Select col:1, col:2
From Banks
Where lower(col:2) like lower(''%' + p_bank_name + '%'')'

??

另外,我可以编写子查询:

Select col:1, col:2
From (
  Select Id, Name
  From Banks
) r
Where lower(col:2) like lower(''%' + p_bank_name + '%'')'

但是,怎么办??

标签: sql

解决方案


这与您尝试做的不完全相同。但是,它几乎就在那里。它不会按数字选择列,但是您不必在编写此查询时从真实表中指定显式列。

正如我们所建议的那样,您必须使用动态 SQL。这是我创造的一个小想法:

create table test1(name1 varchar(10), address1 varchar(10), zipcode1 varchar(10))

insert into test1 values('Test1.1','USA','12344')
insert into test1 values('Test1.2','USA','12344')
insert into test1 values('Test1.3','USA','12344')
insert into test1 values('Test1.4','USA','12344')

create table test2(name2 varchar(10), address2 varchar(10), zipcode2 varchar(10))

insert into test2 values('Test2.1','USA','12344')
insert into test2 values('Test2.2','USA','12344')
insert into test2 values('Test2.3','USA','12344')
insert into test2 values('Test2.4','USA','12344')

您会看到,表名和列名在两者中完全不同。现在这个 sql 语句不关心列名:

select * from
(
    select '' as T1, '' as T2, '' as T3
    union all
    select * from test1   --No matter whether it is Id, Name or description
    union all
    select * from test2   --No matter whether it is Id, Name or description
) as D
where D.T1<>''  -- your other conditions!

唯一的问题是,由于我们使用的是 Union,因此在指定空列时必须匹配列数:

select '' as T1, '' as T2, '' as T3, '' as T4, 0 as T5 -- and so on

这是输出:

在此处输入图像描述


推荐阅读