sql - 在回退到默认值的树状表中选择数据的最佳方法

标签 sql postgresql

我有一个应用程序需要基于某些字段的参数。如果未找到特定字段,应用应获取不太具体的参数值:

+----+-------+-------+------+--------------------------------------+
|PAR | ColA  | ColB  | ColC | value                                |
+----+-------+-------+------+--------------------------------------+
|Par1| *     | *     | *    | (this is the default value)  99      |
+----+-------+-------+------+--------------------------------------+
|Par1| ValA1 | *     | *    | (in case no valid ColB+ColC) 100     |
+----+-------+-------+------+--------------------------------------+
|Par1| ValA1 | ValB1 | *    | (in case no valid ColC)      200     |
+----+-------+-------+------+--------------------------------------+
|Par1| ValA1 | ValB1 | ValC1| (in case everything is specified) 333|
+----+-------+-------+------+--------------------------------------+

所以用户请求:

“Par1”的 ValA1、ValB1、ValC1 -> 将得到“333”

当用户请求时:

“Par1”的 ValA1、ValB1、ValX -> 将得到“200”。

我可以使用一组查询或 UNION 轻松完成此操作(首先查找所有列,而不是查找 ColC='',然后使用 ColB='' 和 ColC='*'等等)但是有更好的方法吗?

例子:

select value from mytab where PAR='Par1' and ColA='ValA1' and ColB='ValB1' and ColC='ValC1' 
UNION
select value from mytab where PAR='Par1' and ColA='ValA1' and ColB='ValB1' and ColC='*' 
UNION
select value from mytab where PAR='Par1' and ColA='ValA1' and ColB='*' and ColC='*' 
UNION
select value from mytab where PAR='Par1' and ColA='*' and ColB='*' and ColC='*' 

然后获取列数最多的“值”!= '*'

我正在使用 Postgresql,但如果有帮助,我愿意使用不同的数据库。

LTREE帮忙吗?

编辑: 表格可能非常大(数百万条记录)。所以按“PAR”选择只能返回一个非常大的(大部分是无用的)结果集并且不如选择正确的行那么快...

最佳答案

select value 
from mytab 
where PAR='Par1' 
ORDER BY
   CASE WHEN ColA='ValA1' and ColB='ValB1' and ColC='ValC1' THEN 0 else 1 END ASC,
   CASE WHEN ColA='ValA1' and ColB='ValB1' THEN 0 else 1 END ASC,
   CASE WHEN ColA='ValA1' THEN 0 else 1 END ASC
LIMIT 1

您可以按表达式添加排序并获得前一个。

更新:

您可以添加到 WHERE 部分

AND (ColA='ValA1' or ColA='*')
AND (ColB='ValB1' or ColB='*')
AND (ColC='ValC1' or ColC='*')

或者更复杂的情况

AND (
   (ColA='ValA1' and ColB='ValB1' and ColC='ValC1')
   OR
   (ColA='ValA1' and ColB='ValB1' and ColC='*')
   OR
   (ColA='ValA1' and ColB='*' and ColC='*')
   OR
   (ColA='*' and ColB='*' and ColC='*')
)

关于sql - 在回退到默认值的树状表中选择数据的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48202152/

相关文章:

python - 如何使用 SQLAlchemy + PostgreSQL 删除自定义类型?

php - 尝试实现全文搜索时出现SQL错误

java - 如何将 String 转换为 Long?

sqlQuery : impossible to get the ID number as Character into R?

mysql - 如何选择总行数作为列

postgresql - GeoJSON FeatureCollections 是否可以用于使用 ST_GeomFromGeoJSON 创建 PostGIS 几何图形?

arrays - 如果对象不存在,则将对象连接到数组

sql - PostgreSQL UNION 仅忽略特定列的重复项

SQL 2005 数据库角色和安全

c - postgresql 的 Windows 安装错误。 make命令出错