Сортировка результатов выбора с использованием связанного параметра в sqlite с C / C ++ API - PullRequest
2 голосов
/ 24 декабря 2010

Мне интересно, можно ли параметризировать столбец сортировки в sqlite.

Я бы хотел подготовить один sqlite3_stmt следующим образом (без простоты проверяя коды возврата).

sqlite3_stmt* the_statement;
const char *sql = "SELECT column1, column2, column3 FROM table1 WHERE column4 = ? ORDER BY ? ASC"
sqlite3_prepare_v2(database, sql, -1, &the_statement, NULL)

и используйте его вот так

sqlite3_bind_int(the_statement, 1, 1);
sqlite3_bind_int(the_statement, 2, COLUMN_TO_SORT_BY);  
while (sqlite3_step(the_statement) == SQLITE_ROW){
    //Do something with each row.  
}
sqlite3_reset()

Когда я выполняю этот код, меняя значение COLUMN_TO_SORT_BY с 1 на 3, мои результаты всегда возвращаются в одном и том же порядкеПорядок, в котором они хранятся в таблице, но также может быть отсортирован по column1).

Итак, мой вопрос: можете ли вы параметризировать аргумент ORDER BY в выражении sqlite при использовании C API?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2011

В выражении CASE ... END нет необходимости, поскольку в SQLite SELECT docs упоминается:

Если выражение ORDER BY является постоянным целым числом K, то выражение считаетсяпсевдоним для K-го столбца набора результатов (столбцы нумеруются слева направо, начиная с 1).

Поэтому просто используйте следующий оператор:

SELECT column1, column2, column3 FROM sometable ORDER BY ? 

И привязать столбец индекса:

sqlite3_bind_int(stmt, 1, col_index); 
0 голосов
/ 24 декабря 2010

Проблема в том, что переданное вами значение обрабатывается как выражение, которое оценивается как фиксированное значение - «1» в первом случае, «3» во втором. Вы можете составить оператор CASE для упорядочения, но он может быстро стать громоздким. Возможно что-то вроде:

ORDER BY
    CASE ?
    WHEN 1 THEN column1
    WHEN 2 THEN column2
    WHEN 3 THEN column3
    END
...