我有一个应用程序需要基于某些字段的参数。如果未找到特定字段,应用应获取不太具体的参数值:
+----+-------+-------+------+--------------------------------------+
|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/