2015-10-06 29 views
1

我試圖寫在SQL case語句說,如果2個參數過去那麼做,如果3那麼...是否possble插入一個Python函數到SQL查詢

我試圖用LEN( XYZ)我知道爲什麼我的代碼是錯誤的,但我不知道如何實現這一目標?否則我得寫有那麼緊湊代碼,如果在外面

LocAll = ('RSA','EC','Grahamstown') 

"""SELECT * 
    FROM User_Skills US, User_Profile UP 
    WHERE US.UserId = UP.UserId 

    CASE WHEN len{0} = {1} THEN 
    UP.country = {2} 
    AND UP.state= {3} 
    AND UP.city= {4} 


    """.format(LocAll, 3,LocAll[0],LocAll[1],LocAll[2])) 

語句謝謝

正如在我使用{0}的評論中所建議的,並將該函數放在.format中(len(LocAll)....)

"""SELECT *, 

     CASE WHEN {0} = {1} 
     THEN 

      WHERE 
      US.UserId = UP.UserId AND 
      UP.country = {2} 
      AND UP.state= {3} 
      AND UP.city= {4} 
     END 

     FROM User_Skills US, User_Profile UP  

    """.format(len(LocAll), 3,LocAll[0],LocAll[1],LocAll[2])) 

但是我得到一個語法錯誤?

+2

而不是LocAll use,len(LocAll)而不是len {0}使用{0} – PeterRing

+0

什麼是語法錯誤?在 – PeterRing

+0

錯誤語法錯誤或接近 「WHERE」 – red8alice

回答

0

剛剛打印出來,檢查來自被取代的字符串:你得到像

  UP.country = RSA 

看到了嗎?由於RSA是一個字符串,你需要添加周圍的引號:

  UP.country = '{}' 

但是,這將是更好的選擇使用「準備好的語句」,讓你的數據庫模塊做你 - 替代,否則你的代碼會崩潰再次您第一次搜索包含單引號的字符串時。也許你確實打算使用準備好的聲明?你的代碼只是使用python的常規字符串替換。

0

WHERE表達更改爲有效CASE語法:

LocAll = ('RSA','EC','Grahamstown') 

"""SELECT 
     * 
    FROM 
     User_Skills US, User_Profile UP 
    WHERE 
     US.UserId = UP.UserId 
     AND 
     1 = CASE WHEN 
       {0} = {1} 
       AND UP.country = {2} 
       AND UP.state= {3} 
       AND UP.city= {4} 
      THEN 1 ELSE 0 END 

""".format(len(LocAll), 3, LocAll[0], LocAll[1], LocAll[2]))