0

我正在使用 MS SQL 2008,我有一个状态字段,如下所示:

"REF CNF PCNF REL"

我需要在CNF不返回的情况下获取所有具有状态的订单PCNF。我可以在 before 和 after 使用空格来做到这一点WHERE STATUS LIKE '% CNF %',但如果 CNF 是第一个或最后一个状态,它将不起作用。

一种有效的解决方案是:

WHERE 
    PATINDEX('CNF %',STATUS)=0 AND 
    PATINDEX('% CNF %',STATUS)=0 AND
    PATINDEX('% CNF',STATUS)=0

但这太可怕了。谢谢,

4

3 回答 3

2

正如 Marc B. 所说,您应该规范化表以避免在单个字段中存储多个值。

如果您没有这样做的凭据,或者如果您想保持模型不变,您可以尝试在字符串前后添加空格:

WHERE ' '+STATUS+' ' LIKE '% CNF %'

这样您就不必担心CNF成为列表中的第一项或最后一项。

我不知道这是否是最优雅/最有效的解决方案,但它确实有效。

于 2013-06-18T15:30:21.393 回答
0

为什么不简单

WHERE STATUS LIKE '% CNF%' OR STATUS LIKE 'CNF%'

?

通配符%匹配任何字符,也没有。

于 2013-06-18T15:35:54.853 回答
0

使用SQL 2008 自己的内部函数,我能想到的最好的方法是将其归结为两个条件,例如:

where STATUS like 'CNF%' or STATUS like '%[^P]CNF%'

但是如果你愿意安装一个 .Net 插件,你可以像这样使用正则表达式:

where 1 = dbo.RegExpLike(STATUS, '(CNF| CNF)')
于 2013-06-18T15:42:28.617 回答