#java #sql #jdbc #hana
#java #sql #jdbc #hana
Вопрос:
Учитывая следующий запрос: SELECT fc as A, sc as B, TO_BIGINT(tc) as C from....
Я хочу получить имена столбцов fc
, sc
, tc
из результирующего набора.
Я делаю следующее:
ResultSet rs = statment.executeQuery(query);
ResultSetMetData rsmd = rs.getMetaData();
for(int i = 1; i <= rsmd.getColumnCount(); i ){
System.out.println(rsmd.getColumnName(i) " " rsmd.getColumnLabel(i);
}
Однако, когда я распечатываю значения, я получаю следующее:
fc a
sc B
TO_BIGINT(tc) c
Нет ли способа игнорировать приведение с помощью jdbc и получить фактическое имя из запроса?
Комментарии:
1. Вы можете поместить любое допустимое выражение в список выбора SQL, а общее выражение позволяет вычислять результат из нескольких входных параметров, включая подзапрос в списке выбора (где вы будете использовать некоторый столбец из таблиц, не входящих в
from
join
предложение or основного запроса). Таким образом, нет практической причины иметь такую возможность. Пожалуйста, опишите, какую задачу вам нужно выполнить в итоге? Просто зная столбец, вы не сможете определить его источник. Может быть, есть другой способ.2. «Нет ли способа игнорировать приведение с помощью jdbc и получить фактическое имя из запроса?» Что вы считаете «фактическим именем»?
getColumnName()
возвращает исходное имя столбца (или, для этой базы данных, выражение), в то времяgetColumnLabel
как возвращает ‘label’ (псевдоним или исходное имя столбца, если псевдоним не используется). В JDBC почти во всех случаях вы должны использоватьgetColumnLabel
.
Ответ №1:
Для выражений меткой столбца по умолчанию является полное выражение.
В примере показано выражение (оно же производный столбец *) с пользовательской меткой ( as C
), и это то, что возвращается клиенту. Это стандартное поведение SQL.
В связи с этим все выражения обрабатываются одинаково, а приведения типов не имеют специальной обработки, которая позволила бы «увеличить исходный столбец».
Короче говоря: вы должны рассматривать ColumnLabel в качестве предполагаемого имени столбца.
Если вы абсолютно хотите / должны получить базовый столбец из результирующего набора, и вас устраивают все ограничения, тогда вы можете вручную проанализировать результат getColumnName
и выбрать все, что находится в скобках любой функции приведения.
Например, если вы получаете TO_BIGINT( abc )
, вы ищете все, что находится между (
и )
. Это количество деталей, которые вы можете извлечь из результирующего набора.