diff --git a/pbx/pbx_realtime.c b/pbx/pbx_realtime.c
index 453f336198516ca9cb225739a72daab7225ceefc..5a828f44a65ab6eb9e06acd6850497b1a4851583 100755
--- a/pbx/pbx_realtime.c
+++ b/pbx/pbx_realtime.c
@@ -87,9 +87,24 @@ static struct ast_variable *realtime_switch_common(const char *table, const char
 {
 	struct ast_variable *var;
 	char pri[20];
+	char *ematch;
+	char rexten[AST_MAX_EXTENSION + 20]="";
 	snprintf(pri, sizeof(pri), "%d", priority);
-	printf("%s/%s/%s/%s exists\n", table, context, exten, pri);
-	var = ast_load_realtime(table, "context", context, "exten", exten, "priority", pri, NULL);
+	switch(mode) {
+	case MODE_MATCHMORE:
+		ematch = "exten LIKE";
+		snprintf(rexten, sizeof(rexten), "%s_%%", exten);
+		break;
+	case MODE_CANMATCH:
+		ematch = "exten LIKE";
+		snprintf(rexten, sizeof(rexten), "%s%%", exten);
+		break;
+	case MODE_MATCH:
+	default:
+		ematch = "exten";
+		strncpy(rexten, exten, sizeof(rexten) - 1);
+	}
+	var = ast_load_realtime(table, "context", context, ematch, rexten, "priority", pri, NULL);
 	return var;
 }
 
@@ -143,6 +158,8 @@ static int realtime_matchmore(struct ast_channel *chan, const char *context, con
 {
 	REALTIME_COMMON(MODE_MATCHMORE);
 	if (var) ast_destroy_realtime(var);
+	if (var)
+		res = 1;
 	return res > 0 ? res : 0;
 }
 
diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c
index 512ed9f8ed3bcb3692d6c602bb3cb79b8b936f84..e6001ae55aaf6b4f42fe468940a9a713409569ad 100755
--- a/res/res_config_odbc.c
+++ b/res/res_config_odbc.c
@@ -31,19 +31,6 @@ STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
 
-static void parseop(char *newp, int newplen, char **opo, const char *newparam)
-{
-	char *op;
-	strncpy(newp, newparam, newplen - 1);
-	op = strchr(newp, ' ');
-	if (op) {
-		*op = '\0';
-		op++;
-	} else
-		op = "=";
-	*opo = op;
-}
-
 static struct ast_variable *realtime_odbc(const char *database, const char *table, va_list ap)
 {
 	odbc_obj *obj;
@@ -51,7 +38,6 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl
 	char sql[1024];
 	char coltitle[256];
 	char rowdata[2048];
-	char newp[256];
 	char *op;
 	const char *newparam, *newval;
 	char *stringp;
@@ -90,15 +76,14 @@ static struct ast_variable *realtime_odbc(const char *database, const char *tabl
 		return NULL;
 	}
 	newval = va_arg(aq, const char *);
-	parseop(newp, sizeof(newp), &op, newparam);
-	snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s %s ?", table, newp, op);
+	if (!strchr(newparam, ' ')) op = " ="; else op = "";
+	snprintf(sql, sizeof(sql), "SELECT * FROM %s WHERE %s%s ?", table, newparam, op);
 	while((newparam = va_arg(aq, const char *))) {
-		parseop(newp, sizeof(newp), &op, newparam);
-		snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s %s ?", newparam, op);
+		if (!strchr(newparam, ' ')) op = " ="; else op = "";
+		snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " AND %s%s ?", newparam, op);
 		newval = va_arg(aq, const char *);
 	}
 	va_end(aq);
-	
 	res = SQLPrepare(stmt, sql, SQL_NTS);
 	if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
 		ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql);