我正在使用MS SQL 2008,我有一个状态字段,如下所示:
"REF CNF PCNF REL"
我需要获取状态为CNF
的所有订单,而不返回PCNF
。
我可以在WHERE STATUS LIKE '% CNF %'
之前和之后使用空格来做,但如果CNF是第一个或最后一个状态,它将起作用。
一个有效的解决方案是:
WHERE
PATINDEX('CNF %',STATUS)=0 AND
PATINDEX('% CNF %',STATUS)=0 AND
PATINDEX('% CNF',STATUS)=0
但那太可怕了。 谢谢,
答案 0 :(得分:2)
正如Marc B.所说,你应该对你的表进行规范化,以避免在一个字段中存储多个值。
如果您没有这样做的凭据,或者您希望保持模型不变,可以尝试在字符串之前和之后添加空格:
WHERE ' '+STATUS+' ' LIKE '% CNF %'
这样您就不必担心CNF
成为列表中的第一项或最后一项。
我不知道它是否是最优雅/最有效的解决方案,但它确实有效。
答案 1 :(得分:0)
为什么不简单
WHERE STATUS LIKE '% CNF%' OR STATUS LIKE 'CNF%'
通配符%
匹配任何字符,也不匹配。
答案 2 :(得分:0)
使用SQL 2008's own internal functions,我能想到的最好的方法就是将其归结为以下两个条件:
where STATUS like 'CNF%' or STATUS like '%[^P]CNF%'
但是如果你愿意install a .Net add-on,你可以使用正则表达式:
where 1 = dbo.RegExpLike(STATUS, '(CNF| CNF)')