如何在SQL中搜索数组

时间:2013-10-21 06:44:15

标签: delphi delphi-xe2

我有4种类型的熔岩,水,黑暗和自然。我想对每一个进行查询,一次一个。目前我有

    procedure TFGame.GetStartingCards;
var
   ManaType :string  ;
begin
Manatype := 'Nothing';
    while ManaType <> 'Nature' do
      begin
        if ManaType = 'Dark' then
            ManaType := 'Nature';
        if ManaType = 'Water' then
            ManaType := 'Dark';
        if Manatype = 'Lava' then
            Manatype := 'Water';
        if Manatype = 'Nothing' then
           ManaType := 'Lava' ;
        with adoquery1 do
          begin
             close;
             sql.Clear;
             sql.Add('SELECT * ');
             sql.Add('FROM Cards');
             sql.Add('WHERE Color='''+ManaType+'''');
             open;
          end;

          //return the result of everything for giving mana type..
    end;

但似乎是一种更好的方法,比如将每个mana类型放入一个数组并使用该数组来提供查询。但无法让它发挥作用。所以问题是,如果我决定保留这样的话会有任何缺陷吗?

3 个答案:

答案 0 :(得分:8)

我建议为mana引入一个枚举类型,也许是一个用于查询的字符串const数组

type 
  TManaType = (mtNothing, mtNature, mtDark, mtWater, mtLava);

const
  cManaQueryNames : array[mtNothing..mtLaval] of string =
    ('nothing','nature','dark','water','lava');

此外,在您的数据库中,您可以考虑将manatype存储为数字,与TManaType的数值(ord)相对应,这样在您的数据库中,水的法术力应该存储为ord(mtWater)= 3

答案 1 :(得分:1)

您可以使用单个SQL查询来获取法术力类型的所有结果:

SELECT * FROM cards WHERE Color IN ('Dark', 'Nature', 'Water', 'Lava')

或弹出数组中的类型并循环:

for manaType in manaTypes do
begin 
// run an SQL query
end;

阵列是更好的方法,因为您现在可以从其他地方(数据库,配置文件)获取法术力类型,并且它们在源代码中不是硬编码的。这样做更好,因为您可能会改变自己的名字或数字,如果在这种情况下不需要修改和重新编译程序,那就更有效了。

答案 2 :(得分:1)

procedure TFGame.GetStartingCards;
const
  ManaTypes : array [0..4] of string = ('Nothing', 'Lava', 'Water', 'Dark', 'Nature');
var
   i: integer;
begin
  for i := 0 to Length(ManaTypes) - 1 do
  begin
    with adoquery1 do
    begin
      close;
      sql.Clear;
      sql.Add('SELECT * ');
      sql.Add('FROM Cards');
      sql.Add('WHERE Color='''+ManaTypes[i]+'''');
      open;
    end;

      //return the result of everything for giving mana type..
  end;
end;