sql – 如何在正则表达式上连接表
|
假设我有两个表msg用于消息,mnc用于移动网络代码.
SELECT msg.message,msg.src_addr,msg.dst_addr,mnc.name,FROM "msg" JOIN "mnc" ON array_to_string(regexp_matches(msg.src_addr || '+' || msg.dst_addr,'38(...)'),'') = mnc.code 但查询失败并出现错误: psql:marketing.sql:28: ERROR: argument of JOIN/ON must not return a set LINE 12: ON array_to_string(regexp_matches(msg.src_addr || '+' || msg... 有没有办法做这样的加入?还是我走错了路? 解决方法正如@Milen已经提到的那样,regexp_matches()可能是出于你的目的而错误的功能.你想要一个简单的 regular expression match (~).实际上,LIKE operator (~~)会更快:
想象最快的LIKE SELECT msg.message,mnc.name
FROM mnc
JOIN msg ON msg.src_addr ~~ ('%38' || mnc.code || '%')
OR msg.dst_addr ~~ ('%38' || mnc.code || '%')
WHERE length(mnc.code) = 3
此外,您只需要3个字符的mnc.code. 用regexp 您可以使用正则表达式编写相同的内容,但它肯定会更慢.这是一个接近原文的工作示例: SELECT msg.message,mnc.name
FROM mnc
JOIN msg ON (msg.src_addr || '+' || msg.dst_addr) ~ (38 || mnc.code)
AND length(mnc.code) = 3
这也要求msg.src_addr和msg.dst_addr为NOT NULL. 第二个查询演示了附加检查长度(mnc.code)= 3如何进入JOIN条件或WHERE子句.这里效果相同. 使用regexp_matches() 您可以使用 SELECT msg.message,mnc.name
FROM mnc
JOIN msg ON EXISTS (
SELECT *
FROM regexp_matches(msg.src_addr ||'+'|| msg.dst_addr,'38(...)','g') x(y)
WHERE y[1] = mnc.code
)
但相比之下它会很慢 – 或者我认为. 说明: 你得到的所有匹配额外的“全局”开关’g’ – 但是在多行中.所以你需要一个子选择来测试它们(或聚合).把它放在一个EXISTS – 半连接中,你得到你想要的东西. 也许你可以通过三种性能测试报告回来? (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – ZombieCheck异常 – 此SqlTransaction已完成
- sql server的 update from 语句的深究
- SQL Server 系统存储过程 中文说明
- SQL Server SQL语法 分隔符理解
- 轻松掌握MySQL函数中的last_insert_id()
- 我应该用不可变数据结构表示数据库数据吗?
- SQL Server – 在预期条件的上下文中指定的非布尔类型的表达
- 具有前任的SQL列表帐户管理器
- sql – 为什么递归CTE在程序上运行分析函数(ROW_NUMBER)?
- sql-server-2008 – SSRS格式日期从YYYYMMDD到MM / DD / YY
