在 SQLite 中循環列名並為每個列名執行一個命令
我正在嘗試執行以下命令
UPDATE attachments SET colname=TRIM(colname);
在 SQLite 表中的每個列名上。
我在 “如何在 sqlite3 / iPhone 上獲取列名列表?”的答案中找到了以下獲取列名列表的方法。,即
SELECT name FROM PRAGMA_TABLE_INFO('your_table');
這似乎是一種不錯、乾淨、簡單的方法。但是根據PRAGMA Statements,這種方法是特定於 SQLite 的。
無論如何,我想要一個完全在 SQLite 中執行的解決方案。我實際上是使用LuaSQL從 Lua 呼叫 SQLite 。所以我可以在必要時在 Lua 中執行循環。但是在 SQLite 中這樣做似乎更乾淨。
如果它是適用於任何 RDBMS 的通用方法,那就更好了。但這可能是不可能的,如果是的話,它可能會更複雜
你不能在純 sqlite 中做到這一點;列名必須在查詢中硬編碼(這也是為什麼它們不能綁定到參數),即使有一種
UPDATE
在循環中使用的方法,但沒有。
您獲取列列表的方法是一個好的開始。然後,您可以動態建構 SQL 語句來執行您喜歡的任務。但是,您需要一種方法來遍歷結果並執行查詢。這通常是在您用於連接數據庫的應用程序的幫助下完成的,在您的情況下是 Lua。如果您使用的是命令行界面
sqlite3
,則可以為此使用臨時文件:.mode list .headers off .once temp.sql SELECT 'UPDATE attachments SET "' || name || '" = TRIM("' || name || '");' FROM PRAGMA_TABLE_INFO('attachments'); .read temp.sql
在 PostgreSQL 中
psql
,您有\gexec
直接執行此類任務的命令。關於您的其他問題,如何以通用而不是特定於數據庫的方式訪問架構/目錄:這確實很困難。正如您正確辨識的那樣,該
PRAGMA_TABLE_INFO
命令特定於 SQLite。每個數據庫都有自己的方式來訪問這種數據。然而,在 SQL 標準中呼叫了一個特性information_schema
,它的目的是在模式上提供一個不依賴於供應商的視圖。不幸的是,供應商並未廣泛實施,請參閱Wikipedia上的概述。如果您碰巧使用了實現這部分標準的 DBMS,則獲取列名的查詢將是一些東西SELECT column_name FROM information_schema.columns WHERE table_name = 'attachments';
在對所選列應用函式之前,您還應該考慮它們的數據類型,
trim
因為這僅支持字元數據類型。