diff --git a/main.go b/main.go
index 855e7b8dabb508a695d0f8262074cb4c15fd6447..44151672ce0cf2f1be70eab7860aba2cfce5c9bc 100644
--- a/main.go
+++ b/main.go
@@ -289,7 +289,7 @@ type Result interface {
 	// Receives fields that define the order in which elements will be returned
 	// in a query, field names may be prefixed with a minus sign (-) indicating
 	// descending order; ascending order would be used by default.
-	Sort(...string) Result
+	Sort(...interface{}) Result
 
 	// Defines specific fields to be fulfilled on results in this result set.
 	Select(...interface{}) Result
diff --git a/main_test.go b/main_test.go
index ce689374fb3d323bf5ccfe8f5dcc426983de8416..461d52576c1fecc3a55bc7f302b990ba13b25d3e 100644
--- a/main_test.go
+++ b/main_test.go
@@ -517,6 +517,8 @@ func TestSimpleCRUD(t *testing.T) {
 
 func TestFibonacci(t *testing.T) {
 	var err error
+	var res db.Result
+	var total uint64
 
 	for _, wrapper := range wrappers {
 		if settings[wrapper] == nil {
@@ -551,9 +553,39 @@ func TestFibonacci(t *testing.T) {
 				}
 			}
 
+			// Testing sorting by function.
+			res = col.Find(
+				// 5, 6, 7, 3
+				db.Or{
+					db.And{
+						db.Cond{"input >=": 5},
+						db.Cond{"input <=": 7},
+					},
+					db.Cond{"input": 3},
+				},
+			)
+
+			// Testing sort by function.
+			switch wrapper {
+			case `postgresql`:
+				res = res.Sort(db.Raw{`RANDOM()`})
+			case `sqlite`:
+				res = res.Sort(db.Raw{`RANDOM()`})
+			case `mysql`:
+				res = res.Sort(db.Raw{`RAND()`})
+			}
+
+			total, err = res.Count()
+
+			if err != nil {
+				t.Fatalf(`%s: %s`, wrapper, err.Error())
+			}
+
+			if total != 4 {
+				t.Fatalf("%s: Expecting a count of 4, got %d.", wrapper, total)
+			}
+
 			// Find() with IN/$in
-			var res db.Result
-			var total uint64
 			var whereIn db.Cond
 
 			switch wrapper {
diff --git a/mongo/result.go b/mongo/result.go
index a18034d41cc338b4c5e40a7993af6bb1811b98c4..0655eeb03eb46760361e5e9950cf1fae97fdac53 100644
--- a/mongo/result.go
+++ b/mongo/result.go
@@ -75,8 +75,12 @@ func (self *Result) Skip(n uint) db.Result {
 // Determines sorting of results according to the provided names. Fields may be
 // prefixed by - (minus) which means descending order, ascending order would be
 // used otherwise.
-func (self *Result) Sort(fields ...string) db.Result {
-	self.queryChunks.Sort = fields
+func (self *Result) Sort(fields ...interface{}) db.Result {
+	ss := make([]string, len(fields))
+	for i, field := range fields {
+		ss[i] = fmt.Sprintf(`%v`, field)
+	}
+	self.queryChunks.Sort = ss
 	return self
 }
 
diff --git a/mysql/result.go b/mysql/result.go
index 685dde3015ccbb65ed7dd18108778547730cca00..afe77ec208618f2af9adf967d9cbb6d87576aa22 100644
--- a/mysql/result.go
+++ b/mysql/result.go
@@ -86,27 +86,35 @@ func (self *Result) Skip(n uint) db.Result {
 // Determines sorting of results according to the provided names. Fields may be
 // prefixed by - (minus) which means descending order, ascending order would be
 // used otherwise.
-func (self *Result) Sort(fields ...string) db.Result {
+func (self *Result) Sort(fields ...interface{}) db.Result {
 
 	sortColumns := make(sqlgen.SortColumns, 0, len(fields))
 
-	for _, field := range fields {
+	l := len(fields)
+	for i := 0; i < l; i++ {
 		var sort sqlgen.SortColumn
 
-		if strings.HasPrefix(field, `-`) {
-			// Explicit descending order.
-			sort = sqlgen.SortColumn{
-				sqlgen.Column{field[1:]},
-				sqlgen.SqlSortDesc,
-			}
-		} else {
-			// Ascending order.
+		switch value := fields[i].(type) {
+		case db.Raw:
 			sort = sqlgen.SortColumn{
-				sqlgen.Column{field},
+				sqlgen.Column{sqlgen.Raw{fmt.Sprintf(`%v`, value.Value)}},
 				sqlgen.SqlSortAsc,
 			}
+		case string:
+			if strings.HasPrefix(value, `-`) {
+				// Explicit descending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value[1:]},
+					sqlgen.SqlSortDesc,
+				}
+			} else {
+				// Ascending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value},
+					sqlgen.SqlSortAsc,
+				}
+			}
 		}
-
 		sortColumns = append(sortColumns, sort)
 	}
 
diff --git a/postgresql/result.go b/postgresql/result.go
index c17fdc491dade3a6d1a3db04454f337053734ac5..24b3f16b3e57d8e9a587f1368d207ffe5e6508e5 100644
--- a/postgresql/result.go
+++ b/postgresql/result.go
@@ -86,27 +86,35 @@ func (self *result) Skip(n uint) db.Result {
 // Determines sorting of results according to the provided names. Fields may be
 // prefixed by - (minus) which means descending order, ascending order would be
 // used otherwise.
-func (self *result) Sort(fields ...string) db.Result {
+func (self *result) Sort(fields ...interface{}) db.Result {
 
 	sortColumns := make(sqlgen.SortColumns, 0, len(fields))
 
-	for _, field := range fields {
+	l := len(fields)
+	for i := 0; i < l; i++ {
 		var sort sqlgen.SortColumn
 
-		if strings.HasPrefix(field, `-`) {
-			// Explicit descending order.
-			sort = sqlgen.SortColumn{
-				sqlgen.Column{field[1:]},
-				sqlgen.SqlSortDesc,
-			}
-		} else {
-			// Ascending order.
+		switch value := fields[i].(type) {
+		case db.Raw:
 			sort = sqlgen.SortColumn{
-				sqlgen.Column{field},
+				sqlgen.Column{sqlgen.Raw{fmt.Sprintf(`%v`, value.Value)}},
 				sqlgen.SqlSortAsc,
 			}
+		case string:
+			if strings.HasPrefix(value, `-`) {
+				// Explicit descending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value[1:]},
+					sqlgen.SqlSortDesc,
+				}
+			} else {
+				// Ascending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value},
+					sqlgen.SqlSortAsc,
+				}
+			}
 		}
-
 		sortColumns = append(sortColumns, sort)
 	}
 
diff --git a/ql/result.go b/ql/result.go
index de5aa120818d6eee9dddedac6880465b27b893bc..4c9dc6386871d9d797447abd694780dfc2881de7 100644
--- a/ql/result.go
+++ b/ql/result.go
@@ -86,27 +86,35 @@ func (self *result) Skip(n uint) db.Result {
 // Determines sorting of results according to the provided names. Fields may be
 // prefixed by - (minus) which means descending order, ascending order would be
 // used otherwise.
-func (self *result) Sort(fields ...string) db.Result {
+func (self *result) Sort(fields ...interface{}) db.Result {
 
 	sortColumns := make(sqlgen.SortColumns, 0, len(fields))
 
-	for _, field := range fields {
+	l := len(fields)
+	for i := 0; i < l; i++ {
 		var sort sqlgen.SortColumn
 
-		if strings.HasPrefix(field, `-`) {
-			// Explicit descending order.
-			sort = sqlgen.SortColumn{
-				sqlgen.Column{field[1:]},
-				sqlgen.SqlSortDesc,
-			}
-		} else {
-			// Ascending order.
+		switch value := fields[i].(type) {
+		case db.Raw:
 			sort = sqlgen.SortColumn{
-				sqlgen.Column{field},
+				sqlgen.Column{sqlgen.Raw{fmt.Sprintf(`%v`, value.Value)}},
 				sqlgen.SqlSortAsc,
 			}
+		case string:
+			if strings.HasPrefix(value, `-`) {
+				// Explicit descending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value[1:]},
+					sqlgen.SqlSortDesc,
+				}
+			} else {
+				// Ascending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value},
+					sqlgen.SqlSortAsc,
+				}
+			}
 		}
-
 		sortColumns = append(sortColumns, sort)
 	}
 
diff --git a/sqlite/result.go b/sqlite/result.go
index c396daa814ed2b7c5f1d6afd4d499ccc3e2099ed..79f14063fa0560456b65bb450e79d9eedbf793d1 100644
--- a/sqlite/result.go
+++ b/sqlite/result.go
@@ -86,27 +86,35 @@ func (self *result) Skip(n uint) db.Result {
 // Determines sorting of results according to the provided names. Fields may be
 // prefixed by - (minus) which means descending order, ascending order would be
 // used otherwise.
-func (self *result) Sort(fields ...string) db.Result {
+func (self *result) Sort(fields ...interface{}) db.Result {
 
 	sortColumns := make(sqlgen.SortColumns, 0, len(fields))
 
-	for _, field := range fields {
+	l := len(fields)
+	for i := 0; i < l; i++ {
 		var sort sqlgen.SortColumn
 
-		if strings.HasPrefix(field, `-`) {
-			// Explicit descending order.
-			sort = sqlgen.SortColumn{
-				sqlgen.Column{field[1:]},
-				sqlgen.SqlSortDesc,
-			}
-		} else {
-			// Ascending order.
+		switch value := fields[i].(type) {
+		case db.Raw:
 			sort = sqlgen.SortColumn{
-				sqlgen.Column{field},
+				sqlgen.Column{sqlgen.Raw{fmt.Sprintf(`%v`, value.Value)}},
 				sqlgen.SqlSortAsc,
 			}
+		case string:
+			if strings.HasPrefix(value, `-`) {
+				// Explicit descending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value[1:]},
+					sqlgen.SqlSortDesc,
+				}
+			} else {
+				// Ascending order.
+				sort = sqlgen.SortColumn{
+					sqlgen.Column{value},
+					sqlgen.SqlSortAsc,
+				}
+			}
 		}
-
 		sortColumns = append(sortColumns, sort)
 	}