2017-01-17 4 views
1

テーブルの下にmemoという列があります。私は「PAYROLL」のようなキーワードを使ってメモを探していますが、「PAY」という単語は含まれていません。SQLワイルドカードの選択

SELECT DISTINCT memo FROM transaction WHERE memo LIKE '%PAYROLL%' 

上記のクエリでは、「メモ」内に「支払い」があるメモしか見つかりませんでした。ただし、「支払い」をどのように除外できますか?これはまた、単語PAYが含まれていないサブPAYROLLを含むメモを見つけるでしょう

SELECT DISTINCT memo 
FROM transaction 
WHERE memo LIKE '%PAYROLL%' AND 
     memo NOT LIKE 'PAY %' AND 
     memo NOT LIKE '% PAY %' AND 
     memo NOT LIKE '% PAY' 

+3

'AND memo <> 'PAY''?あなたはこれを必要とすべきではありません - 'LIKE'ステートメントはすでにそれをフィルタリングします。 – Siyual

+2

実際にあなたは 'PAY'だけでレコードを選択することはありません –

+0

PAYは最後にできますか?' 'PAY ''を除外することができますが、フレーズがそれで終わるとスペースはありませんここでsinleの単語を一般化する方法は明確ではない –

答えて

0

はこれを試してみてください。スタンドアロンの単語を実際に確認したい場合は、より多くの作業が必要になります。その場合、正規表現が役立つかもしれません。

+0

これはちょうど間違っています – Lamak

+0

あなたは単語として給料を分離するためにスペースを追加する必要があります。それ以外の場合は、 ''%PAY%'のようにPAYROLLを受け取ります。 –

+0

これが失敗する例を挙げてください。 –

1

正規表現で可能である必要があります。「PAY」を含む文字列の先頭と末尾の英数字以外の文字列を除外します。 (あなたがチェックが機能するために開始し、あなたの文字列の末尾に、そのような文字、例えば'.'を、追加する必要があります。)

SELECT DISTINCT memo 
FROM transaction 
WHERE memo LIKE '%PAYROLL%' 
AND '.' || memo || '.' !~ '[^[:alnum:]]PAY[^[:alnum:]]'; 

ティムBiegeleisenは以下のコメントで述べたように、PostgreSQLの正規表現は、単語の境界をサポートしています。それは表現がはるかに簡単になり、私たちは最後にドットを追加し、もうメモの起動に持っていけない:

SELECT DISTINCT memo 
FROM transaction 
WHERE memo LIKE '%PAYROLL%' AND memo !~ '\mPAY\M'; 
+0

@Tim Biegeleisen:Yesとyesを使うだけです。私はregexpの単語の境界で働いたことはありませんし、彼らが利用可能であったことを知らなかった。私は自分の答えを更新するつもりです。ありがとう。 –

0
SELECT DISTINCT memo FROM transaction WHERE memo::tsvector @@ 'PAYROLL & !PAY'::tsquery; 

たぶん、PostgreSQLのテキスト検索を使用しています。