【问题标题】:Postgres SQL to search first occurred stringPostgres SQL 搜索第一个出现的字符串
【发布时间】:2023-04-04 00:22:01
【问题描述】:

我有这个表 Basket 有一个 TEXT 类型的列,这个 Notes 字段没有文本字段,为了简单起见,我在示例中的单词之间使用了一个空格下面,它可以有逗号或冒号或任何标点符号。 我正在为给定的三种水果列表搜索在备注字段中找到的第一个水果:Apple、Orange、Banana - 此搜索条件列表已修复。

Notes
Banana; Apple, Bread. Oats! Milk
Orange, Apple;,. Banana:
Bread'' 'Oat &Milk
Apple, ;Sugar :Banana ,Orange.

查询

SELECT Notes, CASE WHEN Notes ~* 'Apple' Then 'Apple'
                    WHEN Notes ~* 'Banana' Then 'Banana'
                    WHEN Notes ~* 'Orange' Then 'Orange'
              ELSE NULL 
            END AS First_Fruit_Found
FROM Basket; 

我的查询结果:

Notes First_Fruit_Found
Apple Sugar Banana Orange Apple
Orange Apple Banana Apple
Bread Oat Milk NULL
Banana Apple Bread Oats Milk Apple

预期结果:

Notes First_Fruit_Found
Apple Sugar Banana Orange Apple
Orange Apple Banana Orange
Bread Oat Milk NULL or Blank
Banana Apple Bread Oats Milk Banana

我的 CASE 语句查询给出了在 CASE 语句顺序中找到的水果的结果,我希望得到我在 Notes 列中找到的第一个水果的结果,如果我们可以使用 re 重写此查询,请提供帮助或 Postgres 中的任何 STRING 函数/运算符

【问题讨论】:

  • “xyzAppleabc”是否与“Apple”匹配?
  • 是的,它应该返回 Apple

标签: postgresql


【解决方案1】:

您可以为此使用regexp_match()

select notes, 
       (regexp_match(notes, '(?i)(apple|banana|orange)'))[1] as first_fruit
from basket;       

regexp_match() 按找到的顺序返回所有匹配项的数组。 [1] 然后选择第一个数组元素。我通过指定(?i) 使用了不区分大小写的匹配。如果您不希望这样,请删除 (?i) 并在您希望找到它们的情况下指定搜索词。

Online example

【讨论】:

  • 这非常适合我的情况,我必须学习更多关于正则表达式的知识,它们在字符串搜索中非常强大。
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
相关资源
最近更新 更多