根据条件去除

时间:2019-08-03 16:11:43

标签: python sql-server pyodbc

我试图创建一个查询循环,该循环执行从一个实例到另一个实例的交互式步骤。提取正确的数据后

我已将其与数据库连接


我能够运行,但是我想基于datype来应用这些案例:如果COL_NAMES数据类型为varchar,则为'',如果COL_NAME数据类型为float或int,则将其替换为0,对于datetime datatye,将其替换为1880-10-10 现在我只能将空白应用于数据类型:

  a = ','.join(f"[{y}]=isnull([{y}], '')" for y in COL_NAMES)
  a

矿山查询就像

  z = f"[UPDATE ABC_A SET {a}]

1 个答案:

答案 0 :(得分:0)

您已经在遍历SELECT的结果,因此可以将COLUMN_NAME及其对应的默认值存储在dict中,而不是将DATA_TYPE存储在单独的[column_name]=isnull([column_name, ...中。然后,您可以将sql = """\ SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'ABC_A'""" column_defaults = {} for row in crsr.execute(sql): if row.DATA_TYPE in ['varchar', 'nvarchar']: default_value = "''" elif row.DATA_TYPE in ['int', 'float']: default_value = "0" elif row.DATA_TYPE in ['date', 'datetime2']: default_value = "'1880-10-10'" else: raise ValueError(f"Unhandled column type: {row.DATA_TYPE}") column_defaults[row.COLUMN_NAME] = default_value s = ', '.join([f"[{col}]=isnull([{col}], {column_defaults[col]})" for col in column_defaults]) print(s) # [Date]=isnull([Date], '1880-10-10'), [NAME]=isnull([NAME], ''), [FileNo]=isnull([FileNo], 0) sql = f"UPDATE ABC_A SET {s}" print(sql) # UPDATE ABC_A SET [Date]=isnull([Date], '1880-10-10'), [NAME]=isnull([NAME], ''), [FileNo]=isnull([FileNo], 0) 片段粘合在一起,并将其插入到UPDATE语句中:

if/elif/else

这只是一个示例,因此您可能需要向{{1}}块添加更多列类型。