如何解决PostgreSQL中是否有一个函数可以计算跨列的字符串匹配按行
我想根据一些条件覆盖数字。
预期覆盖:
如果一个字符串(在我的示例中仅是一个字母)在3列中出现至少2次,并且该数字列大于某个数字,则覆盖数值 OR
如果3列中的另一个字符串至少出现2次,并且数字列大于其他数字,则覆盖数值,否则,数值保持不变。>
我首先想到的方法是有效的,但前提是该表只有一行。可以以某种方式扩展它以便可以在更多行上使用吗?如果我的方法是错误的,请您指导我去正确的方法吗?
请参阅SQL Fiddle
我们非常感谢您的帮助!
如果字母 a 在 section_1,section_2,section_3 和个数字中重复至少 2 次 > = 3 ,然后用 3 覆盖数字,或者如果字母 b 至少重复 2 次,在 section_1,section_2,section_3 和编号 > = 8 中写入 8 ,否则保持数字不变
CREATE TABLE sections (
id int,section_1 text,section_2 text,section_3 text,number int
);
INSERT INTO sections VALUES
( 1,'a','c',5),( 2,'b',9),( 3,4);
预期结果:
身份证号码
1 3
2 8
3 4
解决方法
您要查找case
表达式吗?
select (case when (section_1 = 'a')::int + (section_2 = 'a')::int + (section_3 = 'a')::int >= 2 and
other_col > threshold
then 'special'
end)
您可以有其他when
条条件。如果确实需要更改值,请将其包含在update
中。
典型的解决方案是使用侧向联接来取消枢轴:
select s.*,x.number as new_number
from sections s
cross join lateral (
select count(*) number
from (values (s.section_1),(s.section_2),(s.section_3)) x(section)
where section = 'a'
) x;
这比重复条件表达式更具可伸缩性,因为您只需要枚举子查询的values()
行构造函数中的列即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。