如何过滤SQL查询购买与字符串完全匹配?

时间:2013-06-18 15:27:05

标签: string sql-server-2008 filter

我正在使用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

但那太可怕了。 谢谢,

3 个答案:

答案 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)')