Использование столбцов таблицы в подготовленном параметре оператора

На моей странице есть раскрывающийся список, который позволяет пользователю выбрать любую категорию поиска, например название, описание и т.д. Итак, у меня есть этот оператор SQL:

select * from table where "selected value from dropdown list" = "searchform"

Я хотел бы передать это подготовленному заявлению следующим образом:

выберите * из таблицы где? знак равно

Поскольку мои операторы select имеют одинаковую форму, только столбцы в предложении where различны, есть ли способ сделать это без ручного создания операторов выбора для каждого столбца?

1 ответ

Да, это называется динамическим sql.

DECLARE @sql AS VARCHAR(MAX)
SET @sql = 'select * from table where ' + @column + ' = ''' + @value + ''''
EXEC(@sql)

Вы должны проверить, имеет ли столбец числовой тип. Вы также должны быть осторожны при использовании SQL-инъекции. Мой пример очень упрощен, поэтому вам нужно сделать свои собственные проверки.

Например, использование QUOTENAME было бы полезно:

DECLARE @sql AS VARCHAR(MAX)
SET @sql = 'select * from table where ' + QUOTENAME(@column) + ' = ''' + @value + ''''
EXEC(@sql)

Вышеприведенные примеры - это просто TSQL. В вашем подготовленном заявлении я думаю, что у вас может быть следующее:

PreparedStatement pstmt = con.prepareStatement("
 DECLARE @sql AS VARCHAR(MAX)
 SET @sql = 'select * from table where ' + QUOTENAME(?) + ' = ? '
 EXEC(@sql)
");
pstm.setString(1,columnName);
pstm.setString(2,filterValue);

К сожалению, я не знаком с JAVA, поэтому я не тестировал это. Я думаю, что это стоит попробовать.

Вышеуказанная переменная @sql выдаст оператор вроде:

select * from table where [columnname] = filtervalue

columnname заключенное в скобки, поможет в SQL-инъекции.

licensed under cc by-sa 3.0 with attribution.