我在memo
表下有一个名为transaction
的列。我正在寻找带有'PAYROLL'等关键词的备忘录,但不包含单词'PAY'。
SELECT DISTINCT memo FROM transaction WHERE memo LIKE '%PAYROLL%'
上面的查询只能在其中找到带有“PAYROLL”的备忘录。但是,如何排除“支付”?
答案 0 :(得分:1)
使用正则表达式应该可以:使用前导和尾随的非字母数字字符排除包含“PAY”的字符串。 (您必须在字符串的开头和结尾添加此类字符,例如'.'
,以便检查生效。)
SELECT DISTINCT memo
FROM transaction
WHERE memo LIKE '%PAYROLL%'
AND '.' || memo || '.' !~ '[^[:alnum:]]PAY[^[:alnum:]]';
正如Tim Biegeleisen在下面的评论中提到的,PostgreSQL的正则表达式支持单词边界。这使得表达式变得更加简单,我们不必再在最后添加点和备忘录的开头了:
SELECT DISTINCT memo
FROM transaction
WHERE memo LIKE '%PAYROLL%' AND memo !~ '\mPAY\M';
答案 1 :(得分:0)
试试这个:
SELECT DISTINCT memo
FROM transaction
WHERE memo LIKE '%PAYROLL%' AND
memo NOT LIKE 'PAY %' AND
memo NOT LIKE '% PAY %' AND
memo NOT LIKE '% PAY'
这会找到包含子字符串 PAYROLL
的备忘录,其中也不包含单词PAY
。如果您确实想要检查独立单词,则需要更多工作。在这种情况下,正则表达式可能会有所帮助。
答案 2 :(得分:0)
SELECT DISTINCT memo FROM transaction WHERE memo::tsvector @@ 'PAYROLL & !PAY'::tsquery;
也许可以使用PostgreSQL的文本搜索。