因为我用了 SQL 的 SELECT ..... Field1 IN (......) 的语法
SQL.ADD('SELECT O.*, C.Name AS CName FROM Objects O, Classes C');
SQL.ADD(' WHERE O.ClassID = C.ID AND O.ClassID IN ' + ClassChecked);而这个括号字符串, ClassChecked, 是从画面上一个带有 check box 的 TreeView.CheckList 去组出来的 (c1, c2, c3, .....) 的字符串, 以套入 SELECT 中符合 SQL 语法现在我要比较 2 次的选取, 在意义上是否等效?
(虽然字符串是不相等的, 但 SQL 语义上是等效的)有谁愿意动动脑, 想一个
function IsClassCheckedEqual(const S1, S2: String): Boolean;一起想喔, 看谁先想出来, 看谁的写法最优秀... 嘻嘻...

解决方案 »

  1.   

    是要實現你的SQL功能﹐還是僅比较 2 次的选取, 在意义上是否等效?
    比较 2 次的选取本身沒有意義。
    "ClassChecked, 是从画面上一个带有 check box 的 TreeView.CheckList 去组出来的 (c1, c2, c3, .....) 的字符串"﹐ 其實﹐不管選擇次序如何同﹐组出来的ClassChecked是相同的﹐是"不是問題的問題"。
    你可能是擔心ClassChecked有復的item?
      

  2.   

    有一个集合类set型,采用它做可能很简单,不过我也好象记不清,提个思路罢了。
      

  3.   

    楼上的某几位兄弟,字符也用排序?
    我觉得还是用集合比较好
    还有就zhangqiufk(真言) 说的,用得着比较吗?反正在SQL里都一样!
      

  4.   

    没错, 先排序再比较。我的作法是: 拆解字串 >> 加入 List >> 排序 >> 两个 List 比较。1. 拆解字串 >> 加入 List: 参考 TDataSet.Locate 及 Lookup 拆解第一个参数 Fields 的源码。
    2. 排序: 我没自己排序, 用的是 TStringList 所以设置 Sorted 为 True, 自动排序了
    3. 两个 List 比较: 这就容易了, 既然已排序好了, List1.Strings[I] = List2.String[I], 一对一完全相等, SQL 结果就会等效。
      

  5.   

    两位得 1 分的朋友辛苦了, 但别怀疑, 我有比较的需求, 不然我不会没事提问的。SQL 里会不会等效? 也是执行了才知道, 我为什么要事先检查? 也就是要在执行 SQL 前就做比较, 不然白白送往 database 查询, 岂不浪费时间? 有多浪费? 见仁见智了, 至少我手上这系统是很计较的。我这是系统最后一个画面了, 用了 9 个 table, 最大的那个是 7000 笔记录而已, 看起来不多, 但那是用 database 实现 tree、linked list, 除了 table 之间互相关连之外, tree 和 linked list 部份也在 table 本身 self-relation。所以, 我很要求, 没必要的、等效的 query 就别重复执行了。如果各位写过 database 实现 tree、linked list, 而且画面上还要搞 data-aware control, 那就知道比一般用 table、dbgrid不好搞定, 而且效能很重要。