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

本文关键字:字段 查询 有没有 | 更新日期: 2023-09-27 18:36:15

我有一个有42个字段的表。然而,它们中的大多数大致相似。我有 20 个字段命名为 a01 to a20,另外 20 个字段命名为 b01 to b20。另外 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#中完成的,因此我可以将参数传递给查询。

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

我会在INSERT语句中指定列。这样,如果将新列添加到表中,您的语句仍然会"有效",这为您提供了更好的机会。如果(咳!)表中的列被重新排序,您的语句将不会受到影响。

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

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

当动态 SQL(多个变体)为我提供更好的查询计划时,我也会选择它,也就是说,它以更少的资源获得更好的执行时间。这只是将AND a17 LIKE CONCAT('%',?,'%')附加到 SQL 文本的一些代码以及绑定的相应代码的问题。同样,我只会在它能提高我性能的情况下这样做。

我不会仅仅为了"更短"的 SQL 语句而"缩短"任何 SQL 语句。这对我来说没有意义,因为我宁愿放牧一小群陈述,即使其中一些陈述很大。(在管理语句桶方面,一个大语句实际上比一大堆彼此相似的小语句更容易管理。