【问题标题】:How to create SQL Query with like item1, item2, item3 format at Delphi?如何在 Delphi 中创建类似 item1、item2、item3 格式的 SQL 查询?
【发布时间】:2013-12-29 03:42:37
【问题描述】:

我在 Delphi 使用CheckListEdit 组件,它可以一次选择多个项目。当使用 CheckListEdit1.Text 提取时,我得到了字符串格式的选定项目,如 [item1, item2, item3],我进一步修剪以丢弃第一个和最后一个字符,得到最终字符串为 'item1, item2, item3'。

我的代码如下

glist := CheckListEdit1.Text;
glistindex := Length(glist);
Delete(glist,glistindex,1);
Delete(glist,1,1);

//这里我得到 glist = 'item1, item2, item3..' etc..

现在我想从表中的数据中进行选择,如 item1、item2、item3 等。

我的SQL查询如下

UniTable1.SQL.Text := Select * from emp where group like (:grp);
UniTable1.Params.ParamByName('grp').Value := glist;

但是上面的 SQL 返回错误,因为“like item1, item2, item3”不是正确的格式是否有任何替代方法来创建 SQL 查询,以便它将在 CheckListEdit 中从选定组返回数据?

【问题讨论】:

  • 遗憾的是,这是您必须在不使用参数的情况下构建查询的情况之一......
  • Like 运算符不支持多个参数。我不认为 In 运算符会满足您的需求?
  • 这里是one way来处理这个问题:
  • 我不知道您正在使用的数据库组件,但请检查它们是否有宏 property

标签: sql delphi delphi-xe3


【解决方案1】:

在 IN 运算符中使用参数不正确。您应该使用 IN 参数列表 (:p1, :p2, ..., :pN) 或使用宏:

UniQuery.SQL.Text := 'Select * from emp where group in (&grp)';
UniQuery.MacroByName('grp').AsString := glist;
UniQuery.MacroByName('grp').Active := true;

【讨论】:

    【解决方案2】:

    您需要将其构建为 '(item1, item2, item3)',而不是将字符串构建为 'item1, item2, item3'。那么你的查询就会变成

    Select * from emp where group in (item1, item2, item3)
    

    正如 whosrdaddy 所指出的,您必须将查询构建为连接字符串;无法将值列表作为参数传递。

    【讨论】:

    • 当我写 UniTable1.SQL.Text := 'Select * from emp where pgroup in (officer, manager, clerk)' ...它给出了类似'No such Column:officer'的错误。
    • 如果我写了这样的东西,它可以工作 UniTable1.SQL.Text := 'Select * from emp where pgroup in (''officer'','' manager'', clerk'')'
    • 这取决于您的数据库。我通常只在这样的查询中使用整数(即键)('where pgroup in (1,2,3)')。我认为字母数字值必须在单引号中传递,而不是双引号,这意味着在您的程序中,您必须在每个值之前和之后写两个单引号。最好先用一些命令行工具检查查询。
    • @Noám Newman,它最终与字符串值一起工作,在上面的查询中略有变化,而不使用参数 UniTable1.SQL.Text := 'Select * from emp where pgroup in ('+ glist +')'
    猜你喜欢
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多