更新:我已经更新了测试字符串,以弥补我遗漏的一个 case .

我正在try 使用正则表达式计算查询中的WHERE个过滤器的数量.

因此,通常的 idea 是计算查询中出现的WHEREAND的数量,而不包括发生在JOIN之后和WHERE之前的AND.也不包括第CASE WHEN条中出现的AND条.

例如,此查询:

WITH cte AS (\nSELECT a,b\nFROM something\nWHERE a>10\n AND b<5)\n, cte2 AS (\n SELECT c,\nd FROM another\nWHERE c>10\nAND d<5)\n SELECT CASE WHEN c1.a=1\nAND c2.c=1 THEN 'yes' ELSE 'no' \nEND,c1.a,c1.b,c2.c,c2.d\nFROM cte c1\nINNER JOIN cte2 c2 ON c1.a = c2.c\nAND c1.b = c2.d\nWHERE c1.a<4 AND DATE(c1)>'2022-01-01'\nAND c2.c>6

-- FORMATTED FOR EASE OF READ. PLEASE USE LINE ABOVE AS REGEX TEST STRING
WITH cte AS (
  SELECT a,b 
  FROM something 
  WHERE a>10 
    AND b<5
)

, cte2 AS (
  SELECT c,d
  FROM another
  WHERE c>10
    AND d<5
)

SELECT
  CASE
      WHEN c1.a=1 AND c2.c=1 THEN 'yes'
      WHEN c1.a=1 AND c2.c=1 THEN 'maybe'
      ELSE 'no'
  END,
  c1.a,
  c1.b,
  c2.c,
  c2.d
FROM cte c1
INNER JOIN cte2 c2
   ON c1.a = c2.c
  AND c1.b = c2.d
WHERE c1.a<4
  AND DATE(c1)>'2022-01-01'
  AND c2.c>6

应返回7,它们是:

  1. WHERE a>10
  2. AND b<5
  3. WHERE c>10
  4. AND d<5
  5. WHERE c1.a<4
  6. AND DATE(c1)>'2022-01-01'
  7. AND c2.c>6

不计算部分AND c1.b = c2.d,因为它发生在JOIN之后,WHERE之前.

部分AND c2.c=1不计入,因为它在CASE WHEN条款中.

我最终计划在一个PostgreSQL查询上使用它来统计在特定时间段内所有查询中发生的过滤器的数量.

我试着四处寻找答案,我自己也试过了,但都没有结果.因此在这里寻求帮助.提前谢谢你了!

推荐答案

我尽量不要使用Look,因为它们可能会变得杂乱无章,而且使用起来太痛苦,特别是在具有固定宽度的Look Back断言限制的情况下.

我提出的解决方案是在不同的组中捕获不同的所有场景,然后只 Select 感兴趣的组.不需要的方案仍将匹配,但不会被选中.

  1. 组1-从JOIN开始(不需要)
  2. 组2-从WHERE开始(所需)
  3. 组3-从CASE开始(不需要)
(JOIN.*?(?=$|WHERE|JOIN|CASE|END))|(WHERE.*?(?=$|WHERE|JOIN|CASE|END))|(CASE.*?(?=$|WHERE|JOIN|CASE|END))

Note: Feel free to replace WHERE|JOIN|CASE|END to any keyword you want to be the 'stopper' words. enter image description here

将匹配所有场景,包括不需要的场景,但您只需 Select 组2(以橙色突出显示).

Postgresql相关问答推荐

在Docker Compose中获取CSV文件数据?

Postgres 13.8 -如何在对数据执行窗口操作时返回所有行

mosquito-go-auth with postgres authorization error

时间戳的postgreSQL-to_char如果为零,则不显示微秒

Postgres如何插入带有十进制逗号的实数?

正在加载 pgAdmin 4 v7.4...同时打开 pgAdmin

我想优化查询SQL

PG::UndefinedTable:错误:relation "active_storage_blobs" does not exist

OpenShift:如何从我的 PC 连接到 postgresql

Heroku PGError:operator does not exist: character varying = integer

Rails 重置所有 Postgres 序列?

在远程机器上Restore dump

Postgres UPDATE with ORDER BY,怎么做?

在 row_to_json 函数中 Select 查询

如何使用 postgresql 中的存储过程将数据插入表中

如何正确索引多对多关联表?

如何使用 WITH RECURSIVE 子句进行 Select

Entity Framework Core jsonb 列类型

与 iexact 一起使用时,Django get_or_create 无法设置字段

在 Select (PostgreSQL/pgAdmin) 中将布尔值返回为 TRUE 或 FALSE