有没有办法缩短具有大量字段的查询
本文关键字:字段 查询 有没有 | 更新日期: 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 语句。这对我来说没有意义,因为我宁愿放牧一小群陈述,即使其中一些陈述很大。(在管理语句桶方面,一个大语句实际上比一大堆彼此相似的小语句更容易管理。