Postgresql 在postgres中按大小将三列值与三个输入值进行比较

Postgresql 在postgres中按大小将三列值与三个输入值进行比较,postgresql,Postgresql,我正在编写一个软件,其中我有一个盒子大小,宽度=10,高度=20,长度=10,还有一个Postgres数据库,其中的书架也由宽度,高度,长度定义。现在我想找到所有可以放置特定盒子的架子,架子的尺寸需要大于或等于盒子。我原本以为我可以做到这一点: SELECT shelves.* WHERE shelves.width = 10 AND shelves.height = 20 AND shelves.length = 10 但是,我的盒子可以放在这些架子上,因为它可以旋转以适合: |------

我正在编写一个软件,其中我有一个盒子大小,宽度=10,高度=20,长度=10,还有一个Postgres数据库,其中的书架也由宽度,高度,长度定义。现在我想找到所有可以放置特定盒子的架子,架子的尺寸需要大于或等于盒子。我原本以为我可以做到这一点:

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));