小编Ste*_*fan的帖子

检查WHERE子句中的参数是否为NULL

我遇到了一个需要永久执行的存储过程.这是非常大的,我可以理解,我会花一些时间,但这一次持续将近20分钟.

经过一些调试和研究后,我注意到替换了这部分WHERE条款;

((p_DrumNo IS NULL) OR T_ORDER.ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY))
Run Code Online (Sandbox Code Playgroud)

发了很大的变化.所以只要p_DrumNo为NULL,或者我修改上面的内容就不检查p_DrumNo是否为NULL,程序就可以正常工作;

(T_ORDER.ORDER_ID IN (SELECT ORDER_ID FROM ORDERDELIVERY))
Run Code Online (Sandbox Code Playgroud)

WHERE子句的目标是在p_DrumNo上传递结果集,如果它传入存储过程.WHERE然后该子句继续进一步的条件,但这个特定的条件停止查询.

ORDERDELIVERY只是一个包含与参数p_DrumNo相关的ORDER_ID的临时表.

这个简单的IS NULL检查怎么会造成如此大的影响呢?它可能与OR子查询的使用有关但我不明白为什么因为子查询本身工作得很好.

提前致谢!

更新 [2011-09-23 10:13]

我将问题分解为显示相同行为的小查询;

例A

SQL查询

SELECT * FROM T_ORDER WHERE
('290427' IS NULL OR ORDER_ID IN (SELECT ORDER_ID FROM T_ORDER WHERE ORDERNO LIKE '290427%') );
Run Code Online (Sandbox Code Playgroud)

执行计划

OPERATION   OBJECT_NAME     OPTIONS     COST
------------------------------------------------------------
SELECT STATEMENT                    97
FILTER
TABLE ACCESS    T_ORDER         FULL        95
TABLE ACCESS    T_ORDER         BY INDEX ROWID  2 …
Run Code Online (Sandbox Code Playgroud)

oracle parameters optimization stored-procedures

5
推荐指数
1
解决办法
2万
查看次数

使用正则表达式替换换行符

如何使用正则表达式替换所有类型的换行符(CR、LF 和 CrLf)?

我尝试了 "\n" 和 "\r" 的不同组合,但没有一个找到它们。

formatedString = System.Text.RegularExpressions.Regex.Replace(text, "\r\n", "[Exp 1]")
Run Code Online (Sandbox Code Playgroud)

下面的代码完成了这项工作,但它让我感到烦恼,我似乎无法使用 Regexp 替换换行符。

formatedString = formatedString.Replace(Environment.NewLine, "[Environment.NewLine]") ' Equals CR
formatedString = formatedString.Replace(ControlChars.CrLf, "[ControlChars.CrLf]") ' CR and LF
formatedString = formatedString.Replace(ControlChars.Cr, "[ControlChars.Cr]") ' Carriage Return (CR)
formatedString = formatedString.Replace(ControlChars.Lf, "[ControlChars.Lf]") ' Line Feed (LF)
Run Code Online (Sandbox Code Playgroud)

非常欢迎所有建议!:)

regex vb.net

4
推荐指数
1
解决办法
2万
查看次数