Postgresql 在postgres中按大小将三列值与三个输入值进行比较
我正在编写一个软件,其中我有一个盒子大小,宽度=10,高度=20,长度=10,还有一个Postgres数据库,其中的书架也由宽度,高度,长度定义。现在我想找到所有可以放置特定盒子的架子,架子的尺寸需要大于或等于盒子。我原本以为我可以做到这一点:Postgresql 在postgres中按大小将三列值与三个输入值进行比较,postgresql,Postgresql,我正在编写一个软件,其中我有一个盒子大小,宽度=10,高度=20,长度=10,还有一个Postgres数据库,其中的书架也由宽度,高度,长度定义。现在我想找到所有可以放置特定盒子的架子,架子的尺寸需要大于或等于盒子。我原本以为我可以做到这一点: SELECT shelves.* WHERE shelves.width = 10 AND shelves.height = 20 AND shelves.length = 10 但是,我的盒子可以放在这些架子上,因为它可以旋转以适合: |------
SELECT shelves.* WHERE shelves.width = 10 AND shelves.height = 20 AND shelves.length = 10
但是,我的盒子可以放在这些架子上,因为它可以旋转以适合:
|------|---------|----------|----------|
| id | width | height | length |
|------|---------|----------|----------|
| 1 | 20 | 10 | 10 |
|------|---------|----------|----------|
| 2 | 10 | 20 | 10 |
|------|---------|----------|----------|
| 2 | 10 | 10 | 20 |
|------|---------|----------|----------|
因此,在JavaScript中,此代码如下所示:
const boxdim = [box.width, box.height, box.length].sort();
const shelfdim = [shelf.width, shelf.height, shelf.length].sort();
const canFit = boxdim[0] <= shelfdim[0] && boxdim[1] <= shelfdim[1] && boxdim[2] <= shelfdim[2];
任何提示都值得欣赏。我不是说你应该这样做,但在PostgreSQL中,你可以做一些非常酷或糟糕的事情,这取决于你对数组的看法:
SELECT id, array_agg(d) FROM (
SELECT id, unnest(ARRAY[width, height, length]) AS d
FROM shelves
ORDER BY id, d) X
GRUOP BY id;
您可以将维度排序到一个漂亮的数组中,即Javascript。我建议使用此查询生成一个视图
现在,根据您的代码,您可以使用方框表再次执行此操作,或者只需将三个参数以正确的顺序传递给将在视图上工作的查询
我真的希望有人能提供一个使用标准SQL而不使用数组的答案。在这种情况下,请选择他们的答案: 我不是说你应该这样做,但在PostgreSQL中,你可以做一些很酷或很糟糕的事情,这取决于你对数组的看法:
SELECT id, array_agg(d) FROM (
SELECT id, unnest(ARRAY[width, height, length]) AS d
FROM shelves
ORDER BY id, d) X
GRUOP BY id;
您可以将维度排序到一个漂亮的数组中,即Javascript。我建议使用此查询生成一个视图
现在,根据您的代码,您可以使用方框表再次执行此操作,或者只需将三个参数以正确的顺序传递给将在视图上工作的查询
我真的希望有人能提供一个使用标准SQL而不使用数组的答案。在这种情况下,请选择他们的答案: 为数组提供了排序函数,但如果不想使用该函数或使用其他元素类型,也可以使用该函数
现在,由于数组排序运算符=,等逐元素比较数组内容,要检查每个值是否小于相应的shelf维度,可以使用UNNEST:
为数组提供排序函数,但如果不想使用该函数或使用其他元素类型,也可以使用
现在,由于数组排序运算符=,等逐元素比较数组内容,要检查每个值是否小于相应的shelf维度,可以使用UNNEST:
你的JS代码你的JS代码难以置信!我不敢相信事情竟如此简单。非常感谢!看来postgres数组比较并不像我预期的那样工作。为什么SELECT ARRAY[9,10,10]>=ARRAY[9,9,12]会返回true?它似乎只是比较第一个值,而不是顺序中的所有值?我认为它像比较字符串一样比较它们。10>=9,所以这是真的嗯,我不太确定我是否理解。由于这个原因,代码似乎不能按我需要的方式工作。在数组的最后一项中,10小于12,那么为什么结果为真?哎呀,你完全正确,字符串比较在这种情况下不起作用。让事情变得更复杂。难以置信!我不敢相信事情竟如此简单。非常感谢!看来postgres数组比较并不像我预期的那样工作。为什么SELECT ARRAY[9,10,10]>=ARRAY[9,9,12]会返回true?它似乎只是比较第一个值,而不是顺序中的所有值?我认为它像比较字符串一样比较它们。10>=9,所以这是真的嗯,我不太确定我是否理解。由于这个原因,代码似乎不能按我需要的方式工作。在数组的最后一项中,10小于12,那么为什么结果为真?哎呀,你完全正确,字符串比较在这种情况下不起作用。让事情变得复杂一点。
SELECT *
FROM shelves
WHERE (SELECT bool_and(box_dim <= shelf_dim)
FROM UNNEST(
sort(ARRAY[width, height, length]),
ARRAY[10, 10, 20]
) AS dims(box_dim, shelf_dim));