0

私は MS SQL 2008 を使用しており、次のようなステータス フィールドがあります。

"REF CNF PCNF REL"

CNF返品せずにステータスのあるすべての注文を取得する必要がありますPCNF。の前後にスペースを使用して実行できますWHERE STATUS LIKE '% CNF %'が、CNF が最初または最後のステータスの場合は機能しません。

機能した1つのソリューションは次のとおりです。

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

しかし、それは恐ろしいことです。ありがとう、

4

3 に答える 3

2

Marc B. が言ったように、1 つのフィールドに複数の値を格納しないように、テーブルを正規化する必要があります。

それを行う資格情報がない場合、またはモデルをそのまま維持したい場合は、文字列の前後にスペースを追加してみてください。

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

CNFこれにより、リストの最初または最後の項目になることを心配する必要がなくなります。

それが最もエレガントで効果的なソリューションかどうかはわかりませんが、機能します。

于 2013-06-18T15:30:21.393 に答える
0

SQL 2008 独自の内部関数を使用して、私が考えることができる最善の方法は、次のような 2 つの条件だけにまとめることです。

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

ただし、.Net アドオンをインストールする場合は、次のように正規表現を使用できます。

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