我试图创建一个查询循环,该循环执行从一个实例到另一个实例的交互式步骤。提取正确的数据后
我已将其与数据库连接
我能够运行,但是我想基于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}]
答案 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}}块添加更多列类型。