// Path: src/com/yeamy/sql/statement/AbsColumn.java
// public abstract class AbsColumn<T extends AbsColumn<T>> implements SQLString {
// 	protected String nameAlias;
// 
// 	@SuppressWarnings("unchecked")
// 	public T as(String nameAlias) {
// 		this.nameAlias = nameAlias;
// 		return (T) this;
// 	}
// 
// 	/**
// 	 * tableAlias.name AS alias -> table.name AS alias
// 	 */
// 	public void nameInColumn(StringBuilder sql) {
// 		toSQL(sql);
// 		if (nameAlias != null) {
// 			sql.append(" AS ");
// 			SQLString.appendColumn(sql, nameAlias);
// 		}
// 	}
// 
// 	/**
// 	 * group by / order by
// 	 */
// 	public void shortName(StringBuilder sql) {
// 		if (nameAlias != null) {
// 			SQLString.appendColumn(sql, nameAlias);
// 		} else {
// 			toSQL(sql);
// 		}
// 	}
// 
// }
// 
// Path: src/com/yeamy/sql/statement/SQLString.java
// public interface SQLString {
// 
// 	void toSQL(StringBuilder sb);
// 
// 	public static SQLString asValue(Object v) {
// 		return (sb) -> {
// 			sb.append(v);
// 		};
// 	}
// 
// 	public static String toString(Object value) {
// 		StringBuilder sb = new StringBuilder();
// 		appendValue(sb, value);
// 		return sb.toString();
// 	}
// 
// 	public static void appendDatabase(StringBuilder sb, String database) {
// 		sb.append('`').append(database).append('`');
// 	}
// 
// 	public static void appendTable(StringBuilder sb, String table) {
// 		sb.append('`').append(table).append('`');
// 	}
// 
// 	public static void appendColumn(StringBuilder sb, String column) {
// 		if (Column.ALL.equals(column)) {
// 			sb.append("*");
// 		} else {
// 			sb.append('`').append(column).append('`');
// 		}
// 	}
// 
// 	/**
// 	 * 检查数据安全，添加转义符
// 	 */
// 	public static void appendValue(StringBuilder sb, Object value) {
// 		if (value == null) {
// 			sb.append("NULL");
// 		} else if (value instanceof Number) {
// 			sb.append(value);
// 		} else if (value instanceof Searchable) {
// 			Searchable select = (Searchable) value;
// 			sb.append('(');
// 			select.toSQL(sb);
// 			sb.append(')');
// 		} else if (value instanceof SQLString) {
// 			((SQLString) value).toSQL(sb);
// 		} else if (value instanceof Date) {
// 			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 			value = sdf.format((Date) value);
// 			appendValue(sb, value);
// 		} else {
// 			// as String
// 			sb.append('\'');
// 			String out = value.toString().replace("\'", "\\\'");
// 			sb.append(out);
// 			sb.append('\'');
// 		}
// 	}
// }


import com.yeamy.sql.statement.AbsColumn;
import com.yeamy.sql.statement.SQLString;
package com.yeamy.sql.statement.function;


public class IfNull extends AbsColumn<IfNull> {
	private Object col, whenNull;

	public IfNull(Object col, Object whenNull) {
		this(col, whenNull, null);
	}

	public IfNull(Object col, Object whenNull, String nameAlias) {
		this.col = col;
		this.whenNull = whenNull;
		this.nameAlias = nameAlias;
	}

	@Override
	public void toSQL(StringBuilder sb) {
		sb.append("IFNULL(");
// Path: src/com/yeamy/sql/statement/AbsColumn.java
// public abstract class AbsColumn<T extends AbsColumn<T>> implements SQLString {
// 	protected String nameAlias;
// 
// 	@SuppressWarnings("unchecked")
// 	public T as(String nameAlias) {
// 		this.nameAlias = nameAlias;
// 		return (T) this;
// 	}
// 
// 	/**
// 	 * tableAlias.name AS alias -> table.name AS alias
// 	 */
// 	public void nameInColumn(StringBuilder sql) {
// 		toSQL(sql);
// 		if (nameAlias != null) {
// 			sql.append(" AS ");
// 			SQLString.appendColumn(sql, nameAlias);
// 		}
// 	}
// 
// 	/**
// 	 * group by / order by
// 	 */
// 	public void shortName(StringBuilder sql) {
// 		if (nameAlias != null) {
// 			SQLString.appendColumn(sql, nameAlias);
// 		} else {
// 			toSQL(sql);
// 		}
// 	}
// 
// }
// 
// Path: src/com/yeamy/sql/statement/SQLString.java
// public interface SQLString {
// 
// 	void toSQL(StringBuilder sb);
// 
// 	public static SQLString asValue(Object v) {
// 		return (sb) -> {
// 			sb.append(v);
// 		};
// 	}
// 
// 	public static String toString(Object value) {
// 		StringBuilder sb = new StringBuilder();
// 		appendValue(sb, value);
// 		return sb.toString();
// 	}
// 
// 	public static void appendDatabase(StringBuilder sb, String database) {
// 		sb.append('`').append(database).append('`');
// 	}
// 
// 	public static void appendTable(StringBuilder sb, String table) {
// 		sb.append('`').append(table).append('`');
// 	}
// 
// 	public static void appendColumn(StringBuilder sb, String column) {
// 		if (Column.ALL.equals(column)) {
// 			sb.append("*");
// 		} else {
// 			sb.append('`').append(column).append('`');
// 		}
// 	}
// 
// 	/**
// 	 * 检查数据安全，添加转义符
// 	 */
// 	public static void appendValue(StringBuilder sb, Object value) {
// 		if (value == null) {
// 			sb.append("NULL");
// 		} else if (value instanceof Number) {
// 			sb.append(value);
// 		} else if (value instanceof Searchable) {
// 			Searchable select = (Searchable) value;
// 			sb.append('(');
// 			select.toSQL(sb);
// 			sb.append(')');
// 		} else if (value instanceof SQLString) {
// 			((SQLString) value).toSQL(sb);
// 		} else if (value instanceof Date) {
// 			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 			value = sdf.format((Date) value);
// 			appendValue(sb, value);
// 		} else {
// 			// as String
// 			sb.append('\'');
// 			String out = value.toString().replace("\'", "\\\'");
// 			sb.append(out);
// 			sb.append('\'');
// 		}
// 	}
// }


// Path: src/com/yeamy/sql/statement/function/IfNull.java
import com.yeamy.sql.statement.AbsColumn;
import com.yeamy.sql.statement.SQLString;

package com.yeamy.sql.statement.function;


public class IfNull extends AbsColumn<IfNull> {
	private Object col, whenNull;

	public IfNull(Object col, Object whenNull) {
		this(col, whenNull, null);
	}

	public IfNull(Object col, Object whenNull, String nameAlias) {
		this.col = col;
		this.whenNull = whenNull;
		this.nameAlias = nameAlias;
	}

	@Override
	public void toSQL(StringBuilder sb) {
		sb.append("IFNULL(");
		SQLString.appendValue(sb, col);