ORACLE数据库有一张表A,字段若干...其中字段field1中有数据:JACK,TOM,DANNY,JOHN,ROSE,...等名字我想通过ADOQuery查询存在名字为TOM,DANNY,JOHN的记录——————
var
  string1:string;
begin
   ........
string1:=''TOM'' ,  ''DANNY''  ,  ''ROSE''  /////
   ........    AdoQuery.text:='select * from A'+''
                   +'where name in'''+(string1)+'''';
      ............
查询无数据结果再试:AdoQuery.text:='select * from A'+''
                   'where name in''' + '(' + string1 +')'  +'''';
      ............同样没有数据结果。
注明:string1:=''TOM'' ,  ''DANNY''  ,  ''ROSE''  都是双引号加逗号分隔。我将sring1中的内容直接写到Adoquery中:
...
   'where name in(''Tom'',''Danny'',''Rose'')';
则可以查处相关的记录,好奇怪!各位高手:是不是括号或者单引号的问题呀?怎么用?谢谢!

解决方案 »

  1.   

    不能name in'''+(string1)+'''';吧
    in 是用于集合或枚举吧,怎么能用在字符串上呢?
      

  2.   

    这样试试吧,trim()用来把name的空格去掉:
    adoquery1.sql.text:='select * from A where trim(name) in (''%s'',''%s'',''%s'')';
    adoquery1.sql.text:=format(adoquery1.sql.text,['Tom','Danny','Rose']);
    adoquery1.open;
      

  3.   

    'where name in(''Tom'',''Danny'',''Rose'')';string1:=''TOM'' ,  ''DANNY''  ,  ''ROSE'' ///////////////////////////////////////它们有什么区别?Orcle是区分大小写的。 
      

  4.   

    可以把它们全部转为小写,这样改:string1:=LowerCase(''TOM'' ,  ''DANNY''  ,  ''ROSE'')  /////AdoQuery.text:='select * from A'+''
                       +'where Lower(name) in'''+(string1)+'''';  
      

  5.   

    Delphi中用LowerCase函数。Oracle中用Lower函数,把它们全部转为小写,然后查询,应该没有问题。
      

  6.   

    应该是大小写的问题
    楼主应采用第二种方式,
    数据库的内容如果只是首字符大写,则在程序中处理
    如果字段大写在中间部分,则需要对数据库内容进行调整
    或者sql中用UPPER(name)与程序中字段匹配
    sql中少用函数有利于提高性能
      

  7.   

    那么就是你的引号用法没有用好。在Delphi中两个单引号中间的连续两个单引号才是一个单引号。比如你想要string1=''TOM'' ,  ''DANNY''  ,  ''ROSE''那么你在给string1赋值的时候必须这么写:string1:='''''TOM'''' ,  ''''DANNY''''  ,  ''''ROSE''''';而
    s:='''';(四个)
    showmessage(s); 显示结果:'(一个单引号)
    s:=''';(三个,奇数个) 则无法编译。具体的用法就这样,然后你在根据这个规则修改你的SQL语句。
      

  8.   

    同时要注意'+'(加号)string1:='''''TOM''''' + ' ,  ''''DANNY''''  ,  ''''ROSE''''';结果string1=''TOM'' ,  ''DANNY''  ,  ''ROSE''
      

  9.   

    我连oracle是这么写的,刚才试过了
    var
      str: string;
    begin
      str := '''lu'', ''fancy''';
      ADOQuery1.SQL.Text := 'select * from aa where a in (' + str + ')';
      ADOQuery1.Open;
    end;
      

  10.   

    uses SysUtils;
      
    var
      str:array[0..] of string;
      s:string;
      i:integer;
    begin
      for i:= 0 to ... do
        if str<>'' then
          s:=s+','+quotedstr(str[i])
        else
          s:=s+quotedstr(str[i]);
      
      adoquery.close;
      adoquery.sql.clear;
      adoquery.sql.add(s);
      adoquery.open;
    end;
      

  11.   

    uses SysUtils;
      
    var
      str:array[0..] of string;
      s:string;
      i:integer;
    begin
      for i:= low(str) to high(str) do
        if s<>'' then
          s:=s+','+quotedstr(str[i])
        else
          s:=s+quotedstr(str[i]);
      
      adoquery.close;
      adoquery.sql.clear;
      adoquery.sql.add(s);
      adoquery.open;
    end;
    sorry,写错了
      

  12.   

    uses SysUtils;
      
    var
      str:array[0..] of string;
      s:string;
      i:integer;
      sSql:string;
    begin
      for i:= low(str) to high(str) do
        if s<>'' then
          s:=s+','+quotedstr(str[i])
        else
          s:=s+quotedstr(str[i]);
      
      sSql:='select * from t where t.field in ('+s+')';
      adoquery.close;
      adoquery.sql.clear;
      adoquery.sql.add(sSql);
      adoquery.open;
    end;
    sorry,写错了
      

  13.   

    首先你跟踪一下将ADOQuery1.SQL.Text取到放到SQLPLUS中执行,看是否有结果 如果没有,一定是查询条件的问题,用LIKE 试试
      

  14.   

    我也觉得是引号的问题,你把那生成的SQL语句提取出来,然后按照楼上的做做看
      

  15.   

    肯定是你的引号问题啦  强烈推荐西周生的做法  如果较负责的语句我经常提取出来后在PL/SQL里执行先的
      

  16.   

    建议用chr(39)替换引号,这会少很多问题