убедитесь, что размеры изделия больше заданных значений

#sql #comparison #dimensions

Вопрос:

Я пытаюсь написать SQL-запрос, в котором будут извлечены данные со всеми элементами и их размерами, и должно быть выполнено следующее условие: длина gt;=20 ИЛИ ширина gt;gt;=14 ИЛИ высота gt;gt;gt;=10 (все элементы, которые не поместились бы в контейнер 20x14x10). Проблема в том, что высота может быть больше длины (представьте, что вы переворачиваете предмет в пространстве). Я написал код, но не думаю, что он будет охватывать все случаи. Ниже приведен код, который я пробовал:

 select  items.bin_id, items.bin_type_name,  items.bin_usage_name,  items.isbn, items.boo, items.quantity, ma.pkg_height, ma.pkg_width,  ma.pkg_length,  ma.pkg_weight, items.owner from items  left join BOOKER.D_MP_PHYSICAL_ITEMS ma on items.boo = ma.asin  where ((ma.pkg_length gt;= 20 AND ma.pkg_width gt;= 14 AND ma.pkg_height gt;= 10) OR   (ma.pkg_length gt;= 14 AND ma.pkg_width gt;= 10 AND ma.pkg_height gt;= 20) OR   (ma.pkg_length gt;= 10 AND ma.pkg_width gt;= 20 AND ma.pkg_height gt;= 14) OR   ((ma.pkg_length gt;= 20 AND ma.pkg_width gt;= 10 AND ma.pkg_height gt;= 14) OR   (ma.pkg_length gt;= 14 AND ma.pkg_width gt;= 20 AND ma.pkg_height gt;= 10) OR   (ma.pkg_length gt;= 10 AND ma.pkg_width gt;= 14 AND ma.pkg_height gt;= 20))    

Другая идея, которая у меня была, состояла в том, чтобы выбрать максимальное значение из размеров элемента и проверить, больше ли оно 20, затем выбрать минимальное значение и посмотреть, больше ли оно 10, и проверить, больше ли последнее число 14 (в случае, если два первых значения дают ЛОЖЬ), но я не могу поместить его в SQL

Ответ №1:

Я предполагаю, что приведенная ниже логика будет работать (в основном я пытался написать запрос на логику, о которой вы упомянули в более поздней части вашего вопроса).:

 with temp_cte as (  select   items.*, ma.*,  Select dim from  (SELECT dim, row_number() over (order by dim desc) as rn  FROM (VALUES (ma.pkg_length), (ma.pkg_height), (ma.pkg_width)) AS value(dim)) where rn = 1) as length,  Select dim from  (SELECT dim, row_number() over (order by dim desc) as rn  FROM (VALUES (ma.pkg_length), (ma.pkg_height), (ma.pkg_width)) AS value(dim)) where rn = 2) as height,  Select dim from  (SELECT dim, row_number() over (order by dim desc) as rn  FROM (VALUES (ma.pkg_length), (ma.pkg_height), (ma.pkg_width)) AS value(dim)) where rn = 3) as width  from items   left join BOOKER.D_MP_PHYSICAL_ITEMS ma  on items.boo = ma.asin  where   length gt;= 20 or height gt;= 14 or width gt;= 10 )  Select   bin_id,  bin_type_name,   bin_usage_name,   isbn,  boo,  quantity,  pkg_height,  pkg_width,   pkg_length,   pkg_weight,  owner from temp_cte;