SQL Wild Cards选择

时间:2017-01-17 15:02:07

标签: sql postgresql

我在memo表下有一个名为transaction的列。我正在寻找带有'PAYROLL'等关键词的备忘录,但不包含单词'PAY'。

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

上面的查询只能在其中找到带有“PAYROLL”的备忘录。但是,如何排除“支付”?

3 个答案:

答案 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的文本搜索。