Как инвертировать колонки в sql? - PullRequest
1 голос
/ 28 сентября 2010

Если у меня есть таблица SQL со столбцами:

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

и во время выполнения я добавляю столбцы, следующие за последовательностью столбцов, так что следующий столбец выше будет R_D, за которым следует R_E.

Моя проблема заключается в том, что мне нужно сбрасывать значения столбцов, начинающиеся с R_ (помеченные таким образом, чтобы указывать, что они сбрасываются), обратно в 0 каждый раз, когда я перезапускаю свой скрипт. Кстати, столбцы NR_ фиксированы, поэтому проще сказать что-то вроде:

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

Я знаю, что это недопустимый SQL, но я думаю, что это лучший способ заявить о моей проблеме. Есть мысли?

РЕДАКТИРОВАТЬ: кстати, я использую postgres (если это поможет) и Java.

Ответы [ 4 ]

2 голосов
/ 28 сентября 2010

SQL не поддерживает динамически именованные столбцы или таблицы - ваши варианты:

Java PreparedStatements не изолирует вас от этого - у них та же проблема, только в Java.

1 голос
/ 28 сентября 2010

Вы уверены, что вам нужно добавлять столбцы во время нормальной работы? Динамические модели данных в большинстве случаев очень плохая идея. Вы увидите проблемы с блокировкой и производительностью.

Если вам нужна динамическая модель данных, взгляните на хранилище значений ключей. PostgreSQL также имеет расширение hstore , проверьте вклад.

0 голосов
/ 28 сентября 2010

Если вы предпочитаете использовать скрипт 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

запрос вернет все столбцы с указанным именем таблицы, кроме системного столбца

0 голосов
/ 28 сентября 2010

Если у вас мало столбцов, и вы не ожидаете, что схема изменится, просто перечислите их явно.

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, запрашивая у таблиц столбцы информационной схемы таблицы, но вам, вероятно, понадобится написать функцию plpgsql для зацикливания результатов запроса (одна строка на столбец таблицы начинается с "NR _").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...