有没有办法缩短具有大量字段的查询?

时间:2015-01-05 22:50:13

标签: c# mysql

我有一个有42个字段的表。然而,他们中的大多数大致相似。我有20个名为a01a20的字段,另有20个名为b01b20的字段。另外2个是PK和FK。

有没有办法缩短INSERT查询?现在,由于PK,我必须指定我使用的列,例如:

INSERT INTO Table01 (col_FK, a01, b01, a02, b02.....(etc)

然而,我遇到的真正麻烦是我的SELECT查询。我的查询基本上允许用户搜索一个或多个字段,如果字段留空,则将NULL作为比较。

SELECT * FROM Table01 WHERE
  (@col_FK IS NULL OR col_FK LIKE @col_FK)
  AND (@a01 IS NULL OR a01 LIKE @a01)
  AND (@b01 IS NULL OR b01 LIKE @b01)
  etc...

例如,如果我只在a01中输入内容,并将其余内容留空,则查询将如下所示:

SELECT * FROM Table01 WHERE
  (NULL IS NULL OR col_FK LIKE NULL)
  AND ('text' IS NULL OR a01 LIKE 'text')
  AND (NULL IS NULL OR b01 LIKE NULL)
  etc...

真的不想为所有40个字段做到这一点,所以有什么办法可以缩短它吗?

注意:上面的因子分析(@a01@b01)是在c#中完成的,所以我可以将参数传递给查询。

1 个答案:

答案 0 :(得分:0)

我在INSERT语句中指定了列。这使您有更好的机会,您的陈述仍然可以“工作”#34;如果将新列添加到表中。如果(确认!)表格中的列被重新排序,您的陈述将不受影响。

就缩短SELECT语句而言......只需要一个静态 SQL语句,而不是SQL语句的多个变体。对于MySQL之外的数据库(如Oracle或SQL Server,我个人的偏好是使用带有绑定占位符的单个静态SQL语句。然后,我只有一个需要调整的SQL语句,它保留在池中并被重用,不是十几个或更多不同的变种。

当我获得col IN (?,?,?)时,我选择动态SQL,列表中的值可变。然后问题是绑定占位符的数量以及相应的绑定参数数量。

当我获得更好的查询计划时,我也会选择动态SQL(多种变体),也就是说,它可以用更少的资源获得更好的执行时间。这只是将AND a17 LIKE CONCAT('%',?,'%')附加到SQL文本以及绑定的相应代码的一些代码的问题。再说一遍,如果能让我获得性能提升,我只会为此而烦恼。

我不会"缩短"任何SQL语句只是为了"更短" SQL语句。这对我来说没有意义,因为我宁愿放弃一小群陈述,即使其中一些陈述是巨大的。 (在管理一堆语句方面,一个大型语句实际上比一大堆相互之间相似的小语句更容易管理。

相关问题