Analyze 2 select statements, then merge into one statement
This demo illustrates how to get columns from select list and tables in from clause of 2 select statements, and then create a new select statement based on these columns and tables information.
Input select statement 1:
SELECT product_id, product_name, product_type FROM products WHERE product_type = "widget"
Input select statement 2:
SELECT product_id, product_name, product_ price FROM products WHERE product_price < 100
Generated select statement :
SELECT product_id, product_name, product_type, product_ price FROM products WHERE product_type = “widget” AND product_price < 100
Code to process select statement in C#
using System;
using System.Collections.Generic;
using System.Text;
using gudusoft.gsqlparser;
using gudusoft.gsqlparser.Units;
namespace buildsql
{
class add2sqls
{
string sqlstr1 = @"SELECT product_id, product_name, product_type FROM products WHERE product_type = “widget”"
, sqlstr2 = @"SELECT product_id, product_name, product_ price FROM products WHERE product_price < 100";
TSelectSqlStatement sql1, sql2;
public string addsql()
{
TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVMssql);
TGSqlParser sqlparser2 = new TGSqlParser(TDbVendor.DbVMssql);
sqlparser.SqlText.Text = sqlstr1;
int ret = sqlparser.Parse();
if (ret != 0) return sqlparser.ErrorMessages;
sql1 = sqlparser.SqlStatements[0] as TSelectSqlStatement;
sqlparser2.SqlText.Text = sqlstr2;
ret = sqlparser2.Parse();
if (ret != 0) return sqlparser2.ErrorMessages;
sql2 = sqlparser2.SqlStatements[0] as TSelectSqlStatement;
//get field name
StringBuilder flds = new StringBuilder();
int p = 0;
foreach (TLzField fd in sql1.Fields)
{
if (++p> 1) flds.Append(",");
flds.Append(fd.AsText);
}
foreach (TLzField fd in sql2.Fields)
{
if(flds.ToString().IndexOf(fd.AsText) == -1)
flds.Append(","+fd.AsText);
}
//get tablename name
StringBuilder tlbs = new StringBuilder();
p = 0;
foreach (TLzTable tl in sql1.Tables)
{
if (++p > 1) tlbs.Append(",");
tlbs.Append(tl.AsText);
}
foreach (TLzTable tl in sql2.Tables)
{
if (tlbs.ToString().IndexOf(tl.AsText) == -1)
tlbs.Append("," + tl.AsText);
}
// Console.WriteLine("sb: "+sb.ToString());
// get fields list from sql1
String wherestr = "";
if (sql1.WhereClause != null)
{
wherestr = sql1.WhereClauseText;
}
if (sql2.WhereClause != null)
{
wherestr = wherestr+" and "+sql2.WhereClauseText;
}
return "select " + flds.ToString() + " from " + tlbs.ToString() + " where "+wherestr;
}
}
}
Download this demo: C# version, Java version

