【问题标题】:How do I get my for loop to replace these words in a T-SQL query in python?如何让我的 for 循环在 python 的 T-SQL 查询中替换这些单词?
【发布时间】:2019-08-08 18:13:20
【问题描述】:

我还是 Python 新手,每天都在学习新事物,但我不断遇到一些问题,尽管这些问题很简单,但我无法在网上找到答案。

我只是想通过一个循环来运行,这样我就不必重复相同的多个查询,每个查询只有一个不同的词。

我尝试设置一个名为

的变量
assets = ["AT", "AST", "PAC", "AC"]

我尝试过使用

for i in range(4)
for i in assets

还有更多示例,但我不断收到错误 Invalid column name 'i'

这很明显,因为它没有像我希望的那样通过数组或向量。

assets = ["AT", "AST", "PAC", "AC"]
i = 0
for i in assets:

    q1 = """\
SELECT 'UnC' AS [i], SUM(CASE WHEN [i] IS NULL THEN 1 ELSE 0 END) AS [i 
Count]
    FROM SM.dbo.vSC SCL
        JOIN IP.dbo.vSLUN(3) S
            ON SCL.iSID=S.isID
        JOIN SMa.dbo.S_C SC(noLock) ON S.isID=SC.iSID
WHERE SC.bIsInA IS NULL AND [i] IS NULL"""

df1 = pd.read_sql(q1, conn)
print(df1)

我想实现运行 4 个不同的查询,在每个查询完成后更改名称并存储在一个变量中,我最终希望打印出每个查询的结果。任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: sql sql-server python-3.x loops for-loop


    【解决方案1】:

    在 Python 中,您不能以您尝试的方式插入字符串,特别是将值直接嵌入另一个字符串主体中,这在其他语言(PHP、Perl 等)中可能是可能的。

    通常在 Python 中,使用占位符和绑定值。虽然在 Python (>=2.6) 中有多种插入字符串的方法,但首选的通用方法是使用 str.format。由于您需要格式化相同的值,因此将所有值放在第一个序号位置,{0}:

    for i in assets: 
        q1 = """SELECT 'UnC' AS [{0}], SUM(CASE WHEN [{0}] IS NULL THEN 1 ELSE 0 END) AS [{0} Count]
                FROM SM.dbo.vSC SCL
                JOIN IP.dbo.vSLUN(3) S
                    ON SCL.iSID = S.isID
                JOIN SMa.dbo.S_C SC(noLock) ON S.isID = SC.iSID
                WHERE SC.bIsInA IS NULL AND [{0}] IS NULL
             """
    
        q1 = q1.format(i)
    
        df1 = pd.read_sql(q1, conn)
    

    【讨论】:

    • 我能够使用您的建议运行查询,但我最大的问题是无法通过循环运行到数组中的下一个索引。我想对所有 4 个资产运行查询。我尝试了 assets[0:4],但我显然遗漏了一些东西,我应该将 {0} 更改为 {0:4} 吗?
    • 您要创建四个单独的数据框吗?这应该循环并为每次传递提供不同的 df1 结果。检查df1.head()(在for循环内缩进)。
    • @idcny 请在第一个答案中查看我上面的评论。我 99% 确定您只看到最后一个,因为您的打印功能不在循环内
    【解决方案2】:

    例如像这样编写您的查询:

    q1 = """\
    
      SELECT *REPLACETHIS* FROM whatever;
    

    然后说

    for i in assets:
      print(q1.replace("*REPLACETHIS*", i))
    
    

    希望对你有帮助

    【讨论】:

    • 一开始我是不明白的,直到我按照你说的运行了,当我看到结果后,我就明白了。谢谢。
    • 我现在似乎遇到了另一个问题,它只打印数组“AC”中的最后一个。它不会像我希望的那样打印 4 个查询结果。如果我将 print(x) 放在查询 q1 之前,它会打印所有 4 个项目。查询后,只有最后一个。有什么想法吗?
    • @idcny 您确定所有内容都按应有的方式添加标签吗?我知道这里很难在降价中显示,但如果 print 没有在循环内缩进,它只会做最后一个元素
    【解决方案3】:
    assets = ["AT", "AST", "PAC", "AC"]
    
    x = 0
    for x in assets[0:4]:
    
        q1 = """\
    SELECT 'Unc' AS [x], SUM(CASE WHEN [x] IS NULL THEN 1 ELSE 0 END) AS [x 
    Count]
        FROM SM.dbo.vSC SCL
            JOIN IP.dbo.vSLUNode(3) S
                ON SCL.iSID=S.isID
            JOIN SM.dbo.S_C SC ON 
    S.isID=SC.iSID
    WHERE SC.bIIA IS NULL AND [x] IS NULL"""
    
    
    print(q1.replace("x", x))
    
    
    
    
    
    
     assets = ["AT", "AST", "PAC", "AC"]
    
    
    for i in assets[0:4]:
    
        q1 = """\
    SELECT 'Unc' AS [{0}], SUM(CASE WHEN [{0}] IS NULL THEN 1 ELSE 0 END) AS [{0} Count]
        FROM SM.dbo.vSC SCL
            JOIN IP.dbo.vSLUNode(3) S
                ON SCL.iSID=S.isID
            JOIN SM.dbo.S_C SC ON 
    S.isID=SC.iSID
    WHERE SC.bIIA IS NULL AND [{0}] IS NULL"""
    
    
    q1 = q1.format(i)
    df1 = pd.read_sql(q1, conn)
    print(df1)
    

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 2019-06-21
      • 1970-01-01
      相关资源
      最近更新 更多