假設我有一個people帶有name欄位的表。在該表中有 3 行名稱:Steve, Mark, Ricky
然后我有一個名字串列: [Shane, Ricky, Mark]
我想執行一個查詢,該查詢將回傳表中尚不存在的值。
我知道我可以通過以下方式做到這一點:
names = [Shane, Ricky, Mark]
for name in names:
sql = '''SELECT * FROM people WHERE name=%s'''
db.execute(sql, args=name)
results = db.fetchall()
# If no results are returned for a name
# this means the name isn't already in the table.
if not results:
print(name) # This would return 'Shane' as it's not already in the table.
有沒有一種方法可以使用一個 SQL 陳述句更有效地執行此操作,而不是遍歷串列中的每個名稱?
uj5u.com熱心網友回復:
您可以使用 SQLIN運算子,選擇表中已有的值;
SELECT * FROM people WHERE name IN (...your values...)
然后找出兩個串列之間的差異:
not_in_db = list(set(names).difference(set(results)))
uj5u.com熱心網友回復:
您可以使用: SELECT * FROM people WHERE name NOT IN(...)
uj5u.com熱心網友回復:
未經測驗:
將串列生成為表 (t1),然后從生成的表中回傳,這些值不在您的人員表中。
問題是資料庫無法回傳不存在的值。因此,我們首先使用您的值創建一個臨時表,以便它們存在并可回傳。然后我們在 people 表上摩擦它以找到那些不存在的;從而允許我們回傳不在 people 表中的那些名字。
SELECT *
FROM (values row('Shane'),
row('Ricky'),
row('Mark')) t1 (Name)
WHERE NOT EXISTS (SELECT 1 FROM people P where P.Name = T1.Name)
或者:(如果我記得的話,我認為您不需要在 mySQL 中指定一個表。)
SELECT *
FROM (SELECT 'Shane' as Name UNION ALL
SELECT 'Ricky' UNION ALL
SELECT 'Mark') t1
WHERE NOT EXISTS (SELECT 1 FROM people P where P.Name = T1.Name)
所以上面是你的sql =陳述句的 SQL
盡管在這兩種情況下,我們都應該為 Name 指定資料型別,無論是 varchar、nvarchar 還是長度...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/358091.html
上一篇:計算兩個時間戳之間的值差異
