SQL Select Condition条件查询模拟解析Select函数

在某宝上接到如下题
四、查询类任务
实现数据记录查询选择函数select, 该函数根据表达查询条件的字符串,对加载的数据进行查询。其结果包含两部分,一是符合条件的记录总数,以函数值的形式返回;二是符合条件的所有记录编号,存入通过形参传递而来的数组中。关于查询条件字符串,它类似编程语言的逻辑表达式的结构,其构成可包含:
1)表示关系运算的字符: “<”, “<=”, “>”, “>=”, “==”, “!=”;
2)表示逻辑运算的关键字:“AND”, “OR”, “NOT”;
3)可改变运算优先级别的小括号 " ()",若没有括号两类运算符的优先次序与C/C++中相应的保持一致;
4)字段名,表示对当前记录行指定字段值的引用,如 “Open >= 9.15” 表达的条件就是开盘价大于等于9.15;
5)为了简化,约定字段名在关系运算符的左边,标准格式下运算符前后各一个空格。
通过以上内容,可以灵活写出简单或复合的查询条件。比如 “Open >= 9.15 AND Date == 2017-1-3” 表达了查找2017年1月3日开盘价大于等于9.15的股票交易记录。其中,表达日期时,采取“年-月-日”短横线连接的固定格式。
提示:你需再设计一个解析查询条件字符串的方案,以判断一条记录是否符合需要。
函数的原型:int* Select(const char *condition, int& n); 其中:
1)condition 为查询的条件表达式,具体规则如上所述;
2)n为结果的数量,这里是以引用的形式传入。
3)返回值为整数类型的指针存放数据编号的数组,应考虑将它创建为一个动态数组空间,因为查询结果的具体数目事先不可预知。

给出了如下解决方式,非专修C/C++, 欢迎大佬们批评指正

之所以分享一下, 是因为客户对string类一无所知, 并且一定要用某种递归树去解决,让我改一下, 正巧我忙活半天在外放松休闲, 不想整。 我说,最终解布尔表达式的时候可以递归, 把“true” “false” 设为出口, 循环变递归不就好了吗。
我觉得这个解法真的易懂有木有<<<
看见这题我的第一反应是,后缀表达式, 好像还有个高级的名字
Share with you, Happy Day。

/**	
	--此处仅将 or and not 设为操作符 输出成 || && !  正如not优先级较高 
	--将每个判断例: A>=1 用具体的那条记录过滤,即是判断该记录中的那个字段是否附合这个最小条件  输出 成一个true 或者 false
	--即该表达式转为 一个关于true和false的布尔表达式
	求解布尔表达式  判断该条记录是否符合		 
	下面仅select函数为主要, 其他为测试数据 
**/

#include<stdlib.h>
#include<iostream>
#include <sstream> 
using namespace std;

class Record
{	
// 为了避免字符串与double float long型 或者时间相关的转换, 
// 所有字段全部用字串 比较时直接比较字典序 strcmp
// 此处若自行优化,建议保留字串和日期的字典序比较 
public:
	string Date;
	string Open;
	string High;
	string Low;
	string Close;
	string Adj_Close;
	string Volume;
	string Code;
	string Change;
	string Pct_change;
	
	string getValueByFieldName(string fieldName) {
		if ("Date" == fieldName) {
			return Date;
		} else if ("Open" == fieldName) {
			return Open;
		} else if ("High" == fieldName) {
			return High;			
		} else if ("Low" == fieldName) {
			return Low;			
		} else if ("Close" == fieldName) {
			return Close;			
		} else if ("Adj_Close" == fieldName) {
			return Adj_Close;			
		} else if ("Volume" == fieldName) {
			return Volume;			
		} else if ("Code" == fieldName) {
			return Code;			
		} else if ("Chang
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值