sql - 查找仅包含特定值的行

标签 sql regex postgresql syntax

我有一个表,其中有一个字段表示该行中的数据是否有效。该字段实际上是每个订单的代码编号组合。该字段包含一个未确定长度的字符串。我需要一个只提取该字段中所有字符都包含“AT”的行的查询。

SELECT *
FROM
  (SELECT o.completed_at::TIMESTAMP::date AS "Date",
          u.email AS "User Email",
          o.number AS "Order Number",
          string_agg(sp.name, ', ') AS "Product Name",
          o.total AS "Total Price",
          ssl.name AS "Store Name",
          string_agg(spt.code, ', ') AS code_number
   FROM spree_orders o
   LEFT JOIN spree_users u ON o.user_id = u.id
   LEFT JOIN spree_shipments ss ON ss.order_id = o.id
   LEFT JOIN spree_stock_locations ssl ON ssl.id = ss.stock_location_id
   LEFT JOIN spree_line_items sli ON sli.order_id = o.id
   LEFT JOIN spree_variants sv ON sv.id = sli.variant_id
   LEFT JOIN spree_products sp ON sp.id = sv.product_id
   LEFT JOIN spree_product_types spt ON spt.id = sp.product_type_id
   WHERE o.country_id = 2
     AND o.state = 'complete'
     AND ss.state = 'delivered'
   GROUP BY 1,
            2,
            3,
            5,
            6
   ORDER BY 1 DESC, 2)a
WHERE a.code_number LIKE '%[^AT]%'

当前的输出是这样的:

FC573, MS355, AT256,BKR004, DA261, BEV178, FR133, DA304, FP433, FP097, PET025, AT203
AT101, AT256, AT5465

预期结果

AT101, AT256, AT5465

它应该只显示初始值为“AT”的行

最佳答案

据我了解,您希望匹配仅包含数字、空格、逗号和字母“A”和“T”的组合的值。你可以使用 SIMILAR TO运算符来构建你想要的东西,如正则表达式,例如

WHERE a.code_number SIMILAR TO '[0-9, AT]+'

或者,如果您想要显式序列以 AT 开头,后跟数字,并以逗号和空格分隔,您也可以匹配它:

WHERE a.code_number SIMILAR TO '([AT[0-9]+])(, [AT[0-9]+])*'

关于sql - 查找仅包含特定值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962885/

相关文章:

database - 通过网络连接到 PostgreSQL

mysql - MyIsam 针对多个 %term% 进行全文搜索

regex - 正则表达式固定前缀

java - 用于带有正则表达式的 Java 的 StringTokenizers

perl - Linux:如何安装 DBD::Pg 模块?

mysql - 在 MySQL 或 PostgreSQL 中维护每个项目的大型备份目录表的策略

mysql - 如何针对 AVG 查询优化表?

sql - mysql选择数据

sql - 使用物化路径对树进行排序?

python - 根据子串索引查找内容