如何在选择语句中使用值列表/数组作为列名?

时间:2019-11-13 21:01:05

标签: python sql sql-server oracle

说我有3个要用于构建新查询的数据列表。我需要获取这些数据列表,然后返回找到内容的那些列表的值。

所以我的问题是这个

  

是否有获取列表并将其用作列的标准方法?

我将需要使用多个列表作为列,其中一列是“ JOIN ON”或“ WHERE IN”部分。

第一个查询的结果用于构建我的3个列表。

说我取回这些数据:

[[ID, TYPE, OTHER],
 [1, C, S], 
 [2, C, O],
 [3, D, D],
 [4, D, H]]

然后将该表/ 2D数组转换为以下Python列表:

[1, 2, 3, 4]
[C, C, D, D]
[S, O, D, H]

现在我要使用这2个列表作为select语句中的列,如下所示:

select [C, C, D, D] as TYPE # These 2 list are needed to return in the correct order
      ,[S, O, D, H] as OTHER  # as it relates to [1, 2, 3, 4] in the WHERE.
      ,table.value
      ,table.color
From table
where table.value in [1, 2, 3, 4]  # one list is used to deal with the where 

table包含2列:

VALUE    COLOR
1        Red
2        Green
3        Blue
4        Black

结果应如下所示:

TYPE    OTHER    VALUE    COLOR
C       S        1        Red
C       O        2        Green
D       D        3        Blue
D       H        4        Black

2 个答案:

答案 0 :(得分:0)

更新:

1,将表格转换为3个列表:

import cx_Oracle
import pandas

db = cx_Oracle.connect('*******', '********', '*******')
conn = db.cursor()

sql_test = '''SELECT * FROM TEST'''

sql_table = '''SELECT * FROM "TABLE" '''

df_test = pandas.read_sql_query(sql_test,db)
df_table = pandas.read_sql_query(sql_table,db)

ser_aggCol=df_test.aggregate(lambda x: [x.tolist()], axis=0).map(lambda x:x[0])

print(ser_aggCol, sep='\n', end='\n\n\n')

print(ser_aggCol['ID'])
print(ser_aggCol['TYPE'])
print(ser_aggCol['OTHER'])

输出:

enter image description here

2,使用while循环逐行连接数据帧。

sql_max = '''SELECT MAX(ID) FROM TEST'''
conn.execute(sql_max)
max_id = 0
for result in conn:
    max_id = result[0]

print(max_id)

i = 0
sql_first_row = '''select \'''' + ser_aggCol['TYPE'][i] + '''\' as TYPE, \'''' + ser_aggCol['OTHER'][i] + '''\' AS OTHER, VALUE, COLOR FROM "TABLE" WHERE VALUE = '''+ str(ser_aggCol['ID'][i])
df_result = pandas.read_sql_query(sql_first_row,db)

while i + 1 <= max_id - 1:
    new_sql = '''select \'''' + ser_aggCol['TYPE'][i+1] + '''\' as TYPE, \'''' + ser_aggCol['OTHER'][i+1] + '''\' AS OTHER, VALUE, COLOR FROM "TABLE" WHERE VALUE = '''+ str(ser_aggCol['ID'][i+1])
    df_new = pandas.read_sql_query(new_sql, db)
    df_result = pandas.concat([df_result,df_new])
    i = i + 1

print(df_result)

输出:

enter image description here


原始帖子:

我的方法是:

1,将SQL结果读入数据框

pandas.read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)

2,使用熊猫加入数据框

DataFrame.join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False)


测试:

我的新PC上没有SQL Server客户端,因此仅在Oracle中创建了这两个表。您只需要在Python中添加SQL Server连接。 让我知道你是否被卡在这里。

在Oracle中创建了两个表:

测试:

enter image description here

表格:

enter image description here

然后是Python:

import cx_Oracle
import pandas

db = cx_Oracle.connect('********', '********', '********')
conn = db.cursor()

sql_test = '''SELECT * FROM TEST'''

sql_table = '''SELECT * FROM "TABLE" '''

df_test = pandas.read_sql_query(sql_test,db)
df_table = pandas.read_sql_query(sql_table,db)

print(df_test) 
print(df_table)

print(df_test.set_index('ID').join(df_table.set_index('VALUE')))

输出:

   ID TYPE OTHER
0   1    C     S
1   2    C     O
2   3    D     D
3   4    D     H

   VALUE  COLOR
0      1    Red
1      2  Green
2      3   Blue
3      4  Black

ID  TYPE OTHER  COLOR                  
1     C     S    Red
2     C     O  Green
3     D     D   Blue
4     D     H  Black

答案 1 :(得分:0)

好的,这就是我必须解决的问题。

我将在SQL Server上创建一个新的数据库,然后与该工具进行交互的所有必需表将取代在客户端上管理数据。

然后,我将使程序根据使用该工具的用户在每个表中插入和删除行。

获取用户名很简单:

import os

print(os.getlogin())

因为在99%的时间内一次要为10个用户中的任何一个添加和删除的行少于100行,这将足以处理工作。

与我目前的UNION方法相比,该解决方案效率更高,并且还允许每个用户仅查看和使用与其登录相关的数据。

看到每个表可能永远不会超过10,000行,即使没有主键,我也不认为这是个大问题。

我仍会悬赏,以查看是否有人能提出更好的解决方案,因为这对我的工作很重要,但就目前而言,这已经足够了。