These methods make it easier to create Sequel
expressions without using the core extensions.
Methods
Public Instance
Public Instance methods
Create an SQL::AliasedExpression
for the given expression and alias.
Sequel.as(:column, :alias) # "column" AS "alias" Sequel.as(:column, :alias, [:col_alias1, :col_alias2]) # "column" AS "alias"("col_alias1", "col_alias2")
# File lib/sequel/sql.rb 332 def as(exp, aliaz, columns=nil) 333 SQL::AliasedExpression.new(exp, aliaz, columns) 334 end
Order the given argument ascending. Options:
:nulls |
Set to :first to use NULLS FIRST (so NULL values are ordered before other values), or :last to use NULLS LAST (so NULL values are ordered after other values). |
Sequel.asc(:a) # a ASC Sequel.asc(:b, nulls: :last) # b ASC NULLS LAST
# File lib/sequel/sql.rb 345 def asc(arg, opts=OPTS) 346 SQL::OrderedExpression.new(arg, false, opts) 347 end
Return an SQL::Blob
that holds the same data as this string. Blobs provide proper escaping of binary data. If given a blob, returns it directly.
# File lib/sequel/sql.rb 352 def blob(s) 353 if s.is_a?(SQL::Blob) 354 s 355 else 356 SQL::Blob.new(s) 357 end 358 end
Return an SQL::CaseExpression
created with the given arguments. The first argument are the WHEN
/THEN
conditions, specified as an array or a hash. The second argument is the ELSE
default value. The third optional argument is the CASE
expression.
Sequel.case({a: 1}, 0) # SQL: CASE WHEN a THEN 1 ELSE 0 END Sequel.case({a: 1}, 0, :b) # SQL: CASE b WHEN a THEN 1 ELSE 0 END Sequel.case({{a: [2,3]} => 1}, 0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END Sequel.case([[{a: [2,3]}, 1]], 0) # SQL: CASE WHEN a IN (2, 3) THEN 1 ELSE 0 END
# File lib/sequel/sql.rb 370 def case(*args) 371 SQL::CaseExpression.new(*args) 372 end
Cast
the reciever to the given SQL
type. You can specify a ruby class as a type, and it is handled similarly to using a database independent type in the schema methods.
Sequel.cast(:a, :integer) # CAST(a AS integer) Sequel.cast(:a, String) # CAST(a AS varchar(255))
# File lib/sequel/sql.rb 379 def cast(arg, sql_type) 380 SQL::Cast.new(arg, sql_type) 381 end
Cast
the reciever to the given SQL
type (or the database’s default Integer type if none given), and return the result as a NumericExpression
, so you can use the bitwise operators on the result.
Sequel.cast_numeric(:a) # CAST(a AS integer) Sequel.cast_numeric(:a, Float) # CAST(a AS double precision)
# File lib/sequel/sql.rb 389 def cast_numeric(arg, sql_type = nil) 390 cast(arg, sql_type || Integer).sql_number 391 end
Cast
the reciever to the given SQL
type (or the database’s default String type if none given), and return the result as a StringExpression
, so you can use + directly on the result for SQL
string concatenation.
Sequel.cast_string(:a) # CAST(a AS varchar(255)) Sequel.cast_string(:a, :text) # CAST(a AS text)
# File lib/sequel/sql.rb 399 def cast_string(arg, sql_type = nil) 400 cast(arg, sql_type || String).sql_string 401 end
Return an emulated function call for getting the number of characters in the argument:
Sequel.char_length(:a) # char_length(a) -- Most databases Sequel.char_length(:a) # length(a) -- SQLite
# File lib/sequel/sql.rb 408 def char_length(arg) 409 SQL::Function.new!(:char_length, [arg], :emulate=>true) 410 end
Do a deep qualification of the argument using the qualifier. This recurses into nested structures.
Sequel.deep_qualify(:table, :column) # "table"."column" Sequel.deep_qualify(:table, Sequel[:column] + 1) # "table"."column" + 1 Sequel.deep_qualify(:table, Sequel[:a].like('b')) # "table"."a" LIKE 'b' ESCAPE '\'
# File lib/sequel/sql.rb 418 def deep_qualify(qualifier, expr) 419 Sequel::Qualifier.new(qualifier).transform(expr) 420 end
Return a delayed evaluation that uses the passed block. This is used to delay evaluations of the code to runtime. For example, with the following code:
ds = DB[:table].where{column > Time.now}
The filter is fixed to the time that where was called. Unless you are only using the dataset once immediately after creating it, that’s probably not desired. If you just want to set it to the time when the query is sent to the database, you can wrap it in Sequel.delay:
ds = DB[:table].where{column > Sequel.delay{Time.now}}
Note that for dates and timestamps, you are probably better off using Sequel::CURRENT_DATE and Sequel::CURRENT_TIMESTAMP instead of this generic delayed evaluation facility.
# File lib/sequel/sql.rb 438 def delay(&block) 439 raise(Error, "Sequel.delay requires a block") unless block 440 SQL::DelayedEvaluation.new(block) 441 end
Order the given argument descending. Options:
:nulls |
Set to :first to use NULLS FIRST (so NULL values are ordered before other values), or :last to use NULLS LAST (so NULL values are ordered after other values). |
Sequel.desc(:a) # b DESC Sequel.desc(:b, nulls: :first) # b DESC NULLS FIRST
# File lib/sequel/sql.rb 452 def desc(arg, opts=OPTS) 453 SQL::OrderedExpression.new(arg, true, opts) 454 end
Wraps the given object in an appropriate Sequel
wrapper. If the given object is already a Sequel
object, return it directly. For condition specifiers (hashes and arrays of two pairs), true, and false, return a boolean expressions. For numeric objects, return a numeric expression. For strings, return a string expression. For procs or when the method is passed a block, evaluate it as a virtual row and wrap it appropriately. In all other cases, use a generic wrapper.
This method allows you to construct SQL
expressions that are difficult to construct via other methods. For example:
Sequel.expr(1) - :a # SQL: (1 - a)
On the Sequel
module, this is aliased as [], for easier use:
Sequel[1] - :a # SQL: (1 - a)
# File lib/sequel/sql.rb 472 def expr(arg=(no_arg=true), &block) 473 if defined?(yield) 474 if no_arg 475 return expr(block) 476 else 477 raise Error, 'cannot provide both an argument and a block to Sequel.expr' 478 end 479 elsif no_arg 480 raise Error, 'must provide either an argument or a block to Sequel.expr' 481 end 482 483 case arg 484 when Symbol 485 t, c, a = Sequel.split_symbol(arg) 486 487 arg = if t 488 SQL::QualifiedIdentifier.new(t, c) 489 else 490 SQL::Identifier.new(c) 491 end 492 493 if a 494 arg = SQL::AliasedExpression.new(arg, a) 495 end 496 497 arg 498 when SQL::Expression, LiteralString, SQL::Blob 499 arg 500 when Hash 501 SQL::BooleanExpression.from_value_pairs(arg, :AND) 502 when Array 503 if condition_specifier?(arg) 504 SQL::BooleanExpression.from_value_pairs(arg, :AND) 505 else 506 SQL::Wrapper.new(arg) 507 end 508 when Numeric 509 SQL::NumericExpression.new(:NOOP, arg) 510 when String 511 SQL::StringExpression.new(:NOOP, arg) 512 when TrueClass, FalseClass 513 SQL::BooleanExpression.new(:NOOP, arg) 514 when Proc 515 expr(virtual_row(&arg)) 516 else 517 SQL::Wrapper.new(arg) 518 end 519 end
Extract a datetime_part (e.g. year, month) from the given expression:
Sequel.extract(:year, :date) # extract(year FROM "date")
# File lib/sequel/sql.rb 525 def extract(datetime_part, exp) 526 SQL::NumericExpression.new(:extract, datetime_part, exp) 527 end
Returns a Sequel::SQL::Function
with the function name and the given arguments.
Sequel.function(:now) # SQL: now() Sequel.function(:substr, :a, 1) # SQL: substr(a, 1)
# File lib/sequel/sql.rb 534 def function(name, *args) 535 SQL::Function.new(name, *args) 536 end
Return the argument wrapped as an SQL::Identifier
.
Sequel.identifier(:a) # "a"
# File lib/sequel/sql.rb 541 def identifier(name) 542 SQL::Identifier.new(name) 543 end
Create a BooleanExpression
case insensitive (if the database supports it) pattern match of the receiver with the given patterns. See SQL::StringExpression.like
.
Sequel.ilike(:a, 'A%') # "a" ILIKE 'A%' ESCAPE '\'
# File lib/sequel/sql.rb 578 def ilike(*args) 579 SQL::StringExpression.like(*(args << {:case_insensitive=>true})) 580 end
Return a Sequel::SQL::StringExpression
representing an SQL
string made up of the concatenation of the given array’s elements. If an argument is passed, it is used in between each element of the array in the SQL
concatenation.
Sequel.join([:a]) # SQL: a Sequel.join([:a, :b]) # SQL: a || b Sequel.join([:a, 'b']) # SQL: a || 'b' Sequel.join(['a', :b], ' ') # SQL: 'a' || ' ' || b
# File lib/sequel/sql.rb 554 def join(args, joiner=nil) 555 raise Error, 'argument to Sequel.join must be an array' unless args.is_a?(Array) 556 if joiner 557 args = args.zip([joiner]*args.length).flatten 558 args.pop 559 end 560 561 return SQL::StringExpression.new(:NOOP, '') if args.empty? 562 563 args = args.map do |a| 564 case a 565 when Symbol, ::Sequel::SQL::Expression, ::Sequel::LiteralString, TrueClass, FalseClass, NilClass 566 a 567 else 568 a.to_s 569 end 570 end 571 SQL::StringExpression.new(:'||', *args) 572 end
Create a SQL::BooleanExpression
case sensitive (if the database supports it) pattern match of the receiver with the given patterns. See SQL::StringExpression.like
.
Sequel.like(:a, 'A%') # "a" LIKE 'A%' ESCAPE '\'
# File lib/sequel/sql.rb 586 def like(*args) 587 SQL::StringExpression.like(*args) 588 end
Converts a string into a Sequel::LiteralString
, in order to override string literalization, e.g.:
DB[:items].where(abc: 'def').sql #=> "SELECT * FROM items WHERE (abc = 'def')" DB[:items].where(abc: Sequel.lit('def')).sql #=> "SELECT * FROM items WHERE (abc = def)"
You can also provide arguments, to create a Sequel::SQL::PlaceholderLiteralString
:
DB[:items].select{|o| o.count(Sequel.lit('DISTINCT ?', :a))}.sql #=> "SELECT count(DISTINCT a) FROM items"
# File lib/sequel/sql.rb 603 def lit(s, *args) 604 if args.empty? 605 if s.is_a?(LiteralString) 606 s 607 else 608 LiteralString.new(s) 609 end 610 else 611 SQL::PlaceholderLiteralString.new(s, args) 612 end 613 end
Return a Sequel::SQL::BooleanExpression
created from the condition specifier, matching none of the conditions.
Sequel.negate(a: true) # SQL: a IS NOT TRUE Sequel.negate([[:a, true]]) # SQL: a IS NOT TRUE Sequel.negate([[:a, 1], [:b, 2]]) # SQL: ((a != 1) AND (b != 2))
# File lib/sequel/sql.rb 621 def negate(arg) 622 if condition_specifier?(arg) 623 SQL::BooleanExpression.from_value_pairs(arg, :AND, true) 624 else 625 raise Error, 'must pass a conditions specifier to Sequel.negate' 626 end 627 end
Return a Sequel::SQL::BooleanExpression
created from the condition specifier, matching any of the conditions.
Sequel.or(a: true) # SQL: a IS TRUE Sequel.or([[:a, true]]) # SQL: a IS TRUE Sequel.or([[:a, 1], [:b, 2]]) # SQL: ((a = 1) OR (b = 2))
# File lib/sequel/sql.rb 635 def or(arg) 636 if condition_specifier?(arg) 637 SQL::BooleanExpression.from_value_pairs(arg, :OR, false) 638 else 639 raise Error, 'must pass a conditions specifier to Sequel.or' 640 end 641 end
Create a qualified identifier with the given qualifier and identifier
Sequel.qualify(:table, :column) # "table"."column" Sequel.qualify(:schema, :table) # "schema"."table" Sequel.qualify(:table, :column).qualify(:schema) # "schema"."table"."column"
# File lib/sequel/sql.rb 648 def qualify(qualifier, identifier) 649 SQL::QualifiedIdentifier.new(qualifier, identifier) 650 end
Return an SQL::Subscript
with the given arguments, representing an SQL
array access.
Sequel.subscript(:array, 1) # array[1] Sequel.subscript(:array, 1, 2) # array[1, 2] Sequel.subscript(:array, [1, 2]) # array[1, 2] Sequel.subscript(:array, 1..2) # array[1:2] Sequel.subscript(:array, 1...3) # array[1:2]
# File lib/sequel/sql.rb 660 def subscript(exp, *subs) 661 SQL::Subscript.new(exp, subs.flatten) 662 end
Return an emulated function call for trimming a string of spaces from both sides (similar to ruby’s String#strip).
Sequel.trim(:a) # trim(a) -- Most databases Sequel.trim(:a) # ltrim(rtrim(a)) -- Microsoft SQL Server
# File lib/sequel/sql.rb 669 def trim(arg) 670 SQL::Function.new!(:trim, [arg], :emulate=>true) 671 end
Return a SQL::ValueList
created from the given array. Used if the array contains all two element arrays and you want it treated as an SQL
value list (IN predicate) instead of as a conditions specifier (similar to a hash). This is not necessary if you are using this array as a value in a filter, but may be necessary if you are using it as a value with placeholder SQL:
DB[:a].where([:a, :b]=>[[1, 2], [3, 4]]) # SQL: (a, b) IN ((1, 2), (3, 4)) DB[:a].where('(a, b) IN ?', [[1, 2], [3, 4]]) # SQL: (a, b) IN ((1 = 2) AND (3 = 4)) DB[:a].where('(a, b) IN ?', Sequel.value_list([[1, 2], [3, 4]])) # SQL: (a, b) IN ((1, 2), (3, 4))
# File lib/sequel/sql.rb 682 def value_list(arg) 683 raise Error, 'argument to Sequel.value_list must be an array' unless arg.is_a?(Array) 684 SQL::ValueList.new(arg) 685 end