2010-09-28 105 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。