在我当前的项目中有一个查询,其中给出了一组参数,我需要针对另一个表检查这些参数。这些参数中的每一个都可以为NULL,在这种情况下必须忽略。我目前做的是以下内容:
SELECT t.col1,
t.col2,
t.col3,
t.col4,
t.col5,
t.col6,
t.col7,
t.col8
FROM table1 t
INNER JOIN #parameters p ON (p.col1 IS NULL OR p.col1 = t.col1)
AND (p.col2 IS NULL OR p.col2 = t.col2)
AND (p.col3 IS NULL OR p.col3 = t.col3)
AND (p.col4 IS NULL OR p.col4 = t.col4)
AND (p.col5 IS NULL OR p.col5 = t.col5)
AND (p.col6 IS NULL OR p.col6 = t.col6)
AND (p.col7 IS NULL OR b.col7 >= t.col7)
AND (p.col8 IS NULL OR b.col8 <= t.col8)
这意味着如果参数表中的列为NULL,则将忽略它,否则将与table1中的相应列进行比较。这可行,但不幸的是非常慢。有没有人知道更好的解决方案(除了连接字符串查询之外)?
答案 0 :(得分:0)
您似乎没有任何可用于限制表格中数据的真实标准,而且这种结构通常效果不佳。据我所知,你可以做很多努力来改善它。
这些列中的任何一列是否经常包含在参数中(对于所有行)并且可能会限制很多数据?您可以使用union来执行以下操作:
SELECT ...
FROM table1 t
INNER JOIN #parameters p ON p.col1 = t.col1 ...
union
SELECT ...
FROM table1 t
INNER JOIN #parameters p ... where p.col1 is NULL
如果你很幸运,那样的话可能有用。
我想到的另一个选项是以某种方式迭代#parameters表中的行,这可能是字符串连接的意思。通过使用or
子句或union
构建动态SQL或具有临时值。表可能与ignore dup key index
和创建&amp;为参数-table中的所有行逐个运行动态插入子句。