144 lines
3.3 KiB
C++
144 lines
3.3 KiB
C++
|
//
|
||
|
// This example is implemented from here https://www.tutorialspoint.com/sqlite/sqlite_distinct_keyword.htm
|
||
|
//
|
||
|
|
||
|
#include <sqlite_orm/sqlite_orm.h>
|
||
|
#include <iostream>
|
||
|
|
||
|
using std::cout;
|
||
|
using std::endl;
|
||
|
|
||
|
struct Employee {
|
||
|
int id;
|
||
|
std::string name;
|
||
|
int age;
|
||
|
std::string address;
|
||
|
double salary;
|
||
|
};
|
||
|
|
||
|
auto initStorage(const std::string& path) {
|
||
|
using namespace sqlite_orm;
|
||
|
return make_storage(path,
|
||
|
make_table("COMPANY",
|
||
|
make_column("ID", &Employee::id, primary_key()),
|
||
|
make_column("NAME", &Employee::name),
|
||
|
make_column("AGE", &Employee::age),
|
||
|
make_column("ADDRESS", &Employee::address),
|
||
|
make_column("SALARY", &Employee::salary)));
|
||
|
}
|
||
|
using Storage = decltype(initStorage(""));
|
||
|
|
||
|
int main(int, char**) {
|
||
|
|
||
|
Storage storage = initStorage("distinct.sqlite");
|
||
|
|
||
|
// sync schema in case this is a very first launch
|
||
|
storage.sync_schema();
|
||
|
|
||
|
// remove all employees if it is not the very first launch
|
||
|
storage.remove_all<Employee>();
|
||
|
|
||
|
// now let's insert start values to wirk with. We'll make it within a transaction
|
||
|
// for better perfomance
|
||
|
storage.begin_transaction();
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"Paul",
|
||
|
32,
|
||
|
"California",
|
||
|
20000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"Allen",
|
||
|
25,
|
||
|
"Texas",
|
||
|
15000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"Teddy",
|
||
|
23,
|
||
|
"Norway",
|
||
|
20000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"Mark",
|
||
|
25,
|
||
|
"Rich-Mond",
|
||
|
65000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"David",
|
||
|
27,
|
||
|
"Texas",
|
||
|
85000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"Kim",
|
||
|
22,
|
||
|
"South-Hall",
|
||
|
45000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"James",
|
||
|
24,
|
||
|
"Houston",
|
||
|
10000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"Paul",
|
||
|
24,
|
||
|
"Houston",
|
||
|
20000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"James",
|
||
|
44,
|
||
|
"Norway",
|
||
|
5000.0,
|
||
|
});
|
||
|
storage.insert(Employee{
|
||
|
-1,
|
||
|
"James",
|
||
|
45,
|
||
|
"Texas",
|
||
|
5000.0,
|
||
|
});
|
||
|
storage.commit();
|
||
|
|
||
|
// SELECT 'NAME' FROM 'COMPANY'
|
||
|
auto pureNames = storage.select(&Employee::name);
|
||
|
cout << "NAME" << endl;
|
||
|
cout << "----------" << endl;
|
||
|
for(auto& name: pureNames) {
|
||
|
cout << name << endl;
|
||
|
}
|
||
|
cout << endl;
|
||
|
|
||
|
using namespace sqlite_orm;
|
||
|
// SELECT DISTINCT 'NAME' FROM 'COMPANY'
|
||
|
auto distinctNames = storage.select(distinct(&Employee::name));
|
||
|
cout << "NAME" << endl;
|
||
|
cout << "----------" << endl;
|
||
|
for(auto& name: distinctNames) {
|
||
|
cout << name << endl;
|
||
|
}
|
||
|
cout << endl;
|
||
|
|
||
|
// SELECT DISTINCT 'ADDRESS', 'NAME' FROM 'COMPANY'
|
||
|
auto severalColumns = storage.select(distinct(columns(&Employee::address, &Employee::name)));
|
||
|
cout << "ADDRESS" << '\t' << "NAME" << endl;
|
||
|
cout << "----------" << endl;
|
||
|
for(auto& t: severalColumns) {
|
||
|
cout << std::get<0>(t) << '\t' << std::get<1>(t) << endl;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|