Sqlite

在 SQLite 中循環列名並為每個列名執行一個命令

  • November 15, 2019

我正在嘗試執行以下命令

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因為這僅支持字元數據類型。

引用自:https://dba.stackexchange.com/questions/239633