我在使用子查询(可能效率低下)运行查询之后,使用正则表达式模式可以返回给定记录中包含多少个字符实例。
在这样做时,我遇到了类似的事情:
SELECT t."page",
product_tree_length,
Count(*),
FROM "Table" t
,
LATERAL (SELECT (LENGTH((regexp_matches(t."page", '^.+\/c\/(.+?)(?=\/\?|\?|\/$).*$', 'g'))[1]) - LENGTH(REPLACE(((regexp_matches(t."page", '^.+\/c\/(.+?)(?=\/\?|\?|\/$).*$', 'g'))[1]),'/','')))) AS "product_tree_length"
where t.page like '%\/c/%'
GROUP BY 1, product_tree_length;
但是,在主查询中选择 product_tree_length 时,返回的数据类型是记录,而不是预期的整数。如果我尝试强制转换该值,PostgreSQL 会引发操作无法完成的异常。
知道我做错了什么吗?
谢谢
那么
product_tree_length
是表别名,而不是列别名。因此,如果您在 SELECT 列表中使用该别名,显然您会得到一条记录。您有两个选项可以正确定义列的别名
解决方案一:在派生表中使用列别名:
解决方案二:定义一个列别名作为表别名的一部分:
如果您只想要长度,我认为您不需要横向连接