15template <SqlExpr Left, SqlExpr Right>
19 : left_(
std::move(left)), op_(
std::move(op)), right_(
std::move(right)) {}
21 std::string
to_sql()
const override {
23 ss <<
"(" << left_.to_sql() <<
" " << op_ <<
" " << right_.to_sql() <<
")";
28 auto left_params = left_.bind_params();
29 auto right_params = right_.bind_params();
30 left_params.insert(left_params.end(), right_params.begin(), right_params.end());
41template <SqlExpr Left, SqlExpr Right>
47template <SqlExpr Left, SqlExpr Right>
53template <SqlExpr Left, SqlExpr Right>
59template <SqlExpr Left, SqlExpr Right>
65template <SqlExpr Left, SqlExpr Right>
71template <SqlExpr Left, SqlExpr Right>
77template <SqlExpr Left, SqlExpr Right>
83template <SqlExpr Left, SqlExpr Right>
89template <SqlExpr Expr, std::ranges::range Range>
90 requires std::convertible_to<std::ranges::range_value_t<Range>, std::string>
95 std::string
to_sql()
const override {
97 ss << expr_.to_sql() <<
" IN (";
99 for (
const auto& _ : values_) {
111 auto params = expr_.bind_params();
112 for (
const auto&
value : values_) {
113 params.push_back(
value);
130 std::ranges::range Range>
131 requires std::convertible_to<std::ranges::range_value_t<Range>, std::string>
133 using ValueType = std::ranges::range_value_t<Range>;
136 if constexpr (std::same_as<T, std::string> || std::same_as<T, std::string_view>) {
137 static_assert(std::convertible_to<ValueType, std::string>,
138 "IN operation with string column requires string-convertible values");
139 }
else if constexpr (std::is_arithmetic_v<T>) {
140 static_assert(std::convertible_to<ValueType, std::string>,
141 "IN operation values must be convertible to string for parameter binding");
149template <SqlExpr Expr, std::ranges::range Range>
150 requires std::convertible_to<std::ranges::range_value_t<Range>, std::string>
156 std::stringstream ss;
157 ss << expr_.to_sql() <<
" IN (";
159 for (
const auto& _ : values_) {
171 auto params = expr_.bind_params();
172 for (
const auto&
value : values_) {
173 params.push_back(
value);
189template <SqlExpr Expr, std::ranges::range Range>
190 requires std::convertible_to<std::ranges::range_value_t<Range>, std::string>
191auto in(Expr expr, Range values) {
196template <SqlExpr Expr>
200 : expr_(
std::move(expr)), pattern_(
std::move(pattern)) {}
202 std::string
to_sql()
const override {
return expr_.to_sql() +
" LIKE ?"; }
205 auto params = expr_.bind_params();
206 params.push_back(pattern_);
212 std::string pattern_;
220template <SqlExpr Expr>
221auto like(Expr expr, std::string pattern) {
226template <SqlExpr Expr>
232 std::string
to_sql()
const override {
return expr_.to_sql() +
" BETWEEN ? AND ?"; }
235 auto params = expr_.bind_params();
236 params.push_back(lower_);
237 params.push_back(upper_);
253template <SqlExpr Expr>
259template <SqlExpr Expr>
264 std::string
to_sql()
const override {
return expr_.to_sql() +
" IS NULL"; }
266 std::vector<std::string>
bind_params()
const override {
return expr_.bind_params(); }
276template <SqlExpr Expr>
282template <SqlExpr Expr>
287 std::string
to_sql()
const override {
return expr_.to_sql() +
" IS NOT NULL"; }
289 std::vector<std::string>
bind_params()
const override {
return expr_.bind_params(); }
299template <SqlExpr Expr>
305template <SqlExpr Expr>
310 std::string
to_sql()
const override {
return "(NOT " + expr_.to_sql() +
")"; }
312 std::vector<std::string>
bind_params()
const override {
return expr_.bind_params(); }
319template <SqlExpr Expr>
BETWEEN condition (col BETWEEN lower AND upper)
std::vector< std::string > bind_params() const override
std::string to_sql() const override
BetweenCondition(Expr expr, std::string lower, std::string upper)
Generic binary condition expression.
BinaryCondition(Left left, std::string op, Right right)
std::string to_sql() const override
std::vector< std::string > bind_params() const override
Original IN condition for backward compatibility.
std::string to_sql() const override
InCondition(Expr expr, Range values)
std::vector< std::string > bind_params() const override
IsNotNullCondition(Expr expr)
std::string to_sql() const override
std::vector< std::string > bind_params() const override
std::string to_sql() const override
std::vector< std::string > bind_params() const override
IsNullCondition(Expr expr)
LIKE condition (col LIKE pattern)
LikeCondition(Expr expr, std::string pattern)
std::string to_sql() const override
std::vector< std::string > bind_params() const override
Negation condition (NOT expr)
std::vector< std::string > bind_params() const override
std::string to_sql() const override
IN condition (col IN (values)) with type checking.
std::string to_sql() const override
TypedInCondition(Expr expr, Range values)
std::vector< std::string > bind_params() const override
Represents a column in a database table.
auto like(Expr expr, std::string pattern)
Create a LIKE condition.
auto operator||(Left left, Right right)
Logical OR condition.
auto operator<=(Left left, Right right)
Less than or equal condition (col <= value)
auto in(const schema::column< TableT, Name, T, Modifiers... > &col, Range values)
Create an IN condition with type checking for columns.
auto operator>(Left left, Right right)
Greater than condition (col > value)
auto operator&&(Left left, Right right)
Logical AND condition.
auto operator!(Expr expr)
Logical NOT operator.
auto operator<(Left left, Right right)
Less than condition (col < value)
auto operator>=(Left left, Right right)
Greater than or equal condition (col >= value)
auto to_expr(const C &col, std::string_view table_name="")
Helper to wrap a schema column in a SQL expression.
auto is_null(Expr expr)
Create an IS NULL condition.
auto between(Expr expr, std::string lower, std::string upper)
Create a BETWEEN condition.
auto value(T val)
Create a value expression.
auto lower(Expr expr)
LOWER string function.
auto operator==(Left left, Right right)
Equality condition (col = value)
auto is_not_null(Expr expr)
Create an IS NOT NULL condition.
auto upper(Expr expr)
UPPER string function.
auto operator!=(Left left, Right right)
Inequality condition (col != value)
Base class for SQL expressions.
Compile-time string type that can be used as template non-type parameter in C++20.