NAME
SQL::QueryBuilder::Flex - Yet another flexible SQL builder
SYNOPSIS
use SQL::QueryBuilder::Flex 'SQL';
my ($stmt, @bind) = SQL
->select(qw/user_id name/)
->from('user')
->where('user_id = ?', 1)
->to_sql
;
# $stmt: SELECT user_id, name FROM user
# @bind: (1)
my ($stmt, @bind) = SQL
->select(
'user_id',
'now() AS now',
['LEFT(name, ?)', 'name', 5],
{
name => 'user_name',
group_id => 'group_id',
},
)
->from(qw/user u/)
->left_join(
SQL
->select('user_id', 'SUM(balance) AS balance')
->from('balance')
->where
->or('group_id = ?', 1)
->or('group_id = ?', 2)
->group_by('user_id')
, 'b'
)->on
->and('u.user_id = b.user_id')
->and('b.balance > 0')
->where
->and('u.user_id = ?', 7)
->and('b.balance BETWEEN ? AND ?', 100, 200)
->and_exp
->or('group_id = ?', 1)
->or('group_id = ?', 2)
->or_in('group_id', 5, 6)
->parent
->group_by('LEFT(name, ?)', undef, 2)
->order_by(qw/name desc/)
->limit(10)
->to_sql(1)
;
# SELECT
# user_id,
# now() AS now,
# LEFT(name, ?) AS name,
# group_id AS group_id,
# name AS user_name
# FROM
# user u
# LEFT JOIN (
# SELECT
# user_id,
# SUM(balance) AS balance
# FROM
# balance
# WHERE
# group_id = ?
# OR group_id = ?
# GROUP BY user_id
# ) AS b
# ON
# u.user_id = b.user_id
# AND b.balance > 0
# WHERE
# u.user_id = ?
# AND b.balance BETWEEN ? AND ?
# AND (
# group_id = ?
# OR group_id = ?
# OR group_id IN(?,?)
# )
# GROUP BY LEFT(name, ?)
# ORDER BY name desc
# LIMIT ?
# @bind: (5, 1, 2, 7, 100, 200, 1, 2, 5, 6, 2, 10)
my ($stmt, @bind) = SQL
->select('name')
->from('user1')
->union( SQL->select('name')->from('user2') )
->to_sql
;
# SELECT name FROM user1 UNION SELECT name FROM user2
my ($stmt, @bind) = SQL
->update('user')
->set(
status => 'expired',
updated => \'NOW()',
)
->where('(last_activity + INTERVAL ? DAY) < NOW()', 30)
->to_sql
;
# UPDATE user SET status=?, updated=NOW() WHERE (last_activity + INTERVAL ? DAY) < NOW()
# @bind: ('expired', 30)
my ($stmt, @bind) = SQL
->insert('user',
name => 'User',
status => 'active',
updated => \'NOW()',
)
->options(qw/LOW_PRIORITY IGNORE/)
->to_sql
;
# INSERT LOW_PRIORITY IGNORE user SET name=?, status=?, updated=NOW()
# @bind: ('User', 'active')
my $q1 = SQL
->select(qw/user_id balance/)
->from('balance')
;
my $q2 = SQL
->select(qw/
name
b.balance
/)
->from('user')
->left_join($q1, 'b')->using('user_id')->parent
;
$q2->where('b.balance < 0') if 1;
my ($stmt, @bind) = $q2->to_sql(1);
# SELECT
# name,
# b.balance
# FROM
# user
# LEFT JOIN (
# SELECT
# user_id,
# balance
# FROM
# balance
# ) AS b
# USING (user_id)
# WHERE
# b.balance < 0
DESCRIPTION
SQL::QueryBuilder::Flex is yet another flexible SQL builder.
METHODS
- new(<%options>)
-
Create instance.
my $query = SQL::QueryBuilder::Flex->new()
- to_sql(<indent>)
-
Build SQL.
my ($stmt, @bind) = $query->to_sql()
AUTHOR
Yuriy Ustushenko, <<yoreek@yahoo.com>>
COPYRIGHT AND LICENSE
Copyright (C) 2014 Yuriy Ustushenko
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.