2010-09-28 72 views
1

如果我有列的SQL表:如何在sql中反向選擇列?

NR_A, NR_B, NR_C, NR_D, R_A, R_B, R_C 

,並在運行時,我增加一列之後的列的順序,使得上述下一列將R_D之後R_E。

我的問題是我需要重新設置以R_開頭的列的值(標記爲表示它是可重置的方式),每當我重新運行我的腳本時,都將其重置爲0。 NR_列BTW是固定的,所以它是簡單的,只是這樣說:

UPDATE table set col = 0 where column name starts with 'NR_' 

我知道這是不是一個有效的SQL,但我認爲它的陳述我的問題的最好辦法。 有什麼想法?

編輯:順便說一句,我使用postgres(如果這將幫助)和Java。

+0

改變你的問題的標記..什麼語言,你已經在你的project.tag中使用postgres或其他包括你的項目。 – klox 2010-09-28 03:04:02

+3

如果您必須在運行時添加列,那麼您的模型是嚴重錯誤的。 – 2010-09-28 03:26:51

+0

@ j-16-sdiz:我可以接受你的評論作爲正確答案嗎?它真的解決了我的問題。 – lock 2010-09-28 04:47:22

回答

0

如果您沒有多個列,但您不希望模式發生更改,請將其明確列出。

UPDATE table SET NR_A=0; 
UPDATE table SET NR_B=0; 
UPDATE table SET NR_C=0; 
UPDATE table SET NR_D=0; 

否則,一個簡單的PHP腳本可以動態創建和執行查詢:

<?php 
    $db = pg_connect("host=localhost port=5432 user=postgres password=mypass dbname=mydb"); 
    if(!$db) die("Failed to connect"); 
    $reset_cols = ["A","B","C","D"]; 
    foreach ($col in $reset_cols) { 
     $sql = "UPDATE my_table SET NR_" . $col . "=0"; 
     pg_query($db,$sql); 
    } 
?> 

你也可以查找表中的列在PostgreSQL通過查詢information schema columns表,但你可能需要寫一個plpgsql函數循環查詢結果(每個表格列以「NR_」開頭一行)。

2

SQL不支持動態命名列或表 - 你的選擇是:

的Java的PreparedStatement不要隔離你從此 - 他們有同樣的問題,只是在Java中。

0

如果您寧願使用sql查詢腳本,則應嘗試根據給定的表名獲取所有列。

也許你可以嘗試這個查詢來獲取所有列基於給定的表名在你的查詢中使用。

SELECT attname FROM 
pg_attribute, pg_type 
WHERE typname = 'tablename' --your table name 
AND attrelid = typrelid 
AND attname NOT IN ('cmin', 'cmax', 'ctid', 'oid', 'tableoid', 'xmin', 'xmax') 
--note that this attname is sys column 

查詢將與給定的表名返回所有列,除了系統列

1

你確定你要在正常操作中添加列?動態數據模型大多數情況下都是一個糟糕的主意。你會看到鎖定和性能問題。

如果您需要動態數據模型,請查看鍵值存儲。 PostgreSQL也有擴展hstore,檢查contrib。