PostgreSQL,按行值大小写

PostgreSQL,按行值大小写,sql,postgresql,case-when,Sql,Postgresql,Case When,对于数据集的每一行,我需要使用一些标准进行赋值。 例如: 身份证件 瓦拉 瓦尔布 瓦尔克 瓦尔德 1. 4. 2. 1. 无效的 2. 11 1. 5. 6. 3. 2. 无效的 1. 8. 4. 无效的 3. 2. 无效的 空值使得这个问题变得棘手。但您似乎希望将其视为0或-1: 如果您只希望列中的最大值对我更有意义,那么可以使用横向连接: select t.*, v.typ from t cross join lateral (select v.* from (valu

对于数据集的每一行,我需要使用一些标准进行赋值。 例如:

身份证件 瓦拉 瓦尔布 瓦尔克 瓦尔德 1. 4. 2. 1. 无效的 2. 11 1. 5. 6. 3. 2. 无效的 1. 8. 4. 无效的 3. 2. 无效的 空值使得这个问题变得棘手。但您似乎希望将其视为0或-1:

如果您只希望列中的最大值对我更有意义,那么可以使用横向连接:

select t.*, v.typ
from t cross join lateral
     (select v.*
      from (values ('A', valA), ('B', valB), ('C', valC), ('D', valD)
           ) v(typ, val)
      where v.val is not null
      order by v.val desc
      limit 1
     );

嗯?你的标准没有真正意义。空值是如何处理的?谢谢你的帮助。我需要的不仅仅是最高值,因为标准可以依赖于多个值。第二件事是,我不止有4个专栏,所以有没有比写每一个和每一个when-case更短的方法呢?@hahakomisch。这回答了你在这里提出的问题。对于您想要实现的定制逻辑,似乎一个大规模的案例表达式是唯一的解决方案,至少在给定问题中的信息的情况下是这样。是否有其他逻辑可以更好地解决问题?这是我能找到的唯一可行的解决办法。
select t.*, v.typ
from t cross join lateral
     (select v.*
      from (values ('A', valA), ('B', valB), ('C', valC), ('D', valD)
           ) v(typ, val)
      where v.val is not null
      order by v.val desc
      limit 1
     );