mysql - 具有多个条件的 MySQL 案例未按预期工作
问题描述
这真的很奇怪,我有这个 SQL 查询:
select p.NAME, p.MEASURING_UNIT, p.EAN, p.ITEM_NR, IF(f.FORM_TYPE = 'InventoryList', log.QUANTITY_DIFF, fi.QUANTITY) AS VAL_QUANTITY, IF(IF(f.FORM_TYPE = 'InventoryList', log.QUANTITY_DIFF, fi.QUANTITY)>0,fi.GROSS_MONEY,0) as VAL_GROSS_MONEY, f.FORM_DATE, f.FORM_TYPE, f.DIRECTION, f.FORM_NR, pd.NAME as PARTNER_NAME, ad.CITY,
case f.FORM_TYPE
when 'Quotation' then 'Quot.'
when 'Invoice' then 'Inv.'
when 'Shipment' then 'Ship.'
when 'Orders' then 'Ord.'
when 'FacilityForm' then 'FacF.'
when 'InventoryList' then 'InvL.'
else 'Else'
end as FORM_TYPE_CODE,
case f.DIRECTION
when 1 AND f.FORM_TYPE <> 'InventoryList' then 'Sale'
when 2 AND f.FORM_TYPE <> 'InventoryList' then 'Supply'
when 3 AND f.FORM_TYPE <> 'InventoryList' then 'Moving'
else 'Else'
end as DIRECTION_CODE
from product p join form_item fi on p.id = fi.product_id
join form f on fi.FORM_ID = f.ID
join partner_data pd on pd.ID = f.PARTNER_DATA_ID
join address_data ad on ad.ID = f.ADDRESS_DATA_ID
join inventory_log log on log.FORM_ITEM_ID = fi.ID
where p.id = 8
AND fi.ID IN (SELECT l.FORM_ITEM_ID FROM inventory_log l, inventory_item i, product p
WHERE l.INVENTORY_ITEM_ID = i.ID
AND i.PRODUCT_ID = p.ID
AND p.ID = 8 )
and f.status > 1
order by f.FORM_DATE
...而且看起来第二个 CASE 函数没有像我预期的那样工作。现在,如果 FORM_TYPE 是 'FacilityForm' 并且 DIRECTION 是 2,我希望我能回到 DIRECTION_CODE 'Supply',但我给了我:'Else'...
如果我从中删除第二个条件并保持不变:
when 2 then 'Supply'
它的工作,但我不知道为什么......
有人可以在这里帮助我吗,我错过了什么?谢谢你。
顺便提一句。这是查询结果,错误的值在最后一行:
NAME MEASURING_UNIT EAN ITEM_NR VAL_QUANTITY VAL_GROSS_MONEY FORM_DATE FORM_TYPE DIRECTION FORM_NR PARTNER_NAME CITY FORM_TYPE_CODE DIRECTION_CODE
Test product pc EAN-PRD1 PROD-001 20000 1371600 2018-05-16 Invoice 1 INV-00003/2018 Partner Ltd. CityNameTest Inv. Sale
Test product pc EAN-PRD1 PROD-001 100000 1257300 2018-05-25 Invoice 1 INV-00006/2018 Partner Ltd. CityNameTest Inv. Sale
Test product pc EAN-PRD1 PROD-001 50000 380365 2018-06-02 Invoice 1 INV-00008/2018 Good partner Limited CityNameTest Inv. Sale
Test product pc EAN-PRD1 PROD-001 -33000 0 2018-06-27 InventoryList 1 INVL-00001/2018 New Partner CityNameTest InvL. Else
Test product pc EAN-PRD1 PROD-001 -40000 0 2018-06-29 InventoryList 1 INVL-00002/2018 InventoryList CityNameTest InvL. Else
Test product pc EAN-PRD1 PROD-001 -55000 0 2018-06-30 InventoryList 1 INVL-00003/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 -43000 0 2018-07-11 InventoryList 1 INVL-00004/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 30000 149850 2018-07-13 InventoryList 1 INVL-00014/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 21000 119880 2018-07-13 InventoryList 1 INVL-00012/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 0 0 2018-07-13 InventoryList 1 INVL-00011/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 0 0 2018-07-13 InventoryList 1 INVL-00010/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 0 0 2018-07-13 InventoryList 1 INVL-00009/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 -35000 0 2018-07-13 InventoryList 1 INVL-00008/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 -50000 0 2018-07-13 InventoryList 1 INVL-00007/2018 InventoryList InvL. Else
Test product pc EAN-PRD1 PROD-001 50000 49950 2018-07-18 Invoice 1 INV-00009/2018 Good partner Limited CityNameTest Inv. Sale
Test product pc EAN-PRD1 PROD-001 42000 41958 2018-08-17 Shipment 1 SHP-00002/2018 Good partner Limited CityNameTest Ship. Sale
Test product pc EAN-PRD1 PROD-001 42000 41958 2018-08-17 Shipment 1 SHP-00002/2018 Good partner Limited CityNameTest Ship. Sale
Test product pc EAN-PRD1 PROD-001 50000 49950 2018-09-04 Invoice 1 INV-00010/2018 Good partner Limited CityNameTest Inv. Sale
Test product pc EAN-PRD1 PROD-001 100000 99900 2018-09-05 Invoice 1 INV-00011/2018 Good partner Limited CityNameTest Inv. Sale
Test product pc EAN-PRD1 PROD-001 200000 199800 2018-09-27 FacilityForm 2 FAC-00002/2018 Company partner CityNameTest FacF. Else
解决方案
如果您对列使用大小写,则不能添加额外条件:
case ColumnA
when 1 then 'x'
when 2 then 'y'
else'z'
end
这很有效,因为您正在比较列的内容。
要使用多个条件,请将列移动到 case 语句中:
case
when columna = 1 and columnb = 2 then 'x'
when columna = 2 and columnb = 3 then 'y'
else 'z'
end
推荐阅读
- java - java - 如何通过java中的分页处理通过网络调用的巨大json?
- c# - 使用pinvoke时如何将指针传递给指针参数?
- c# - 如何使用 Windows 应用程序驱动程序/C# 从 TreeItem/DataItem 读取值?
- matlab - 在matlab中重用稀疏非PSD矩阵的符号分解
- python - 有没有办法创建一个新行并将某些元素添加到该行?
- ansible - In ansible using the value of a previously assigned set_fact in a when conditional for jira task skips even though condition is met
- python - 归并排序算法的递归
- git-bash - 如何在 git bash 中打印文本文件的内容?
- xamarin.forms - 如何在 Xamarin.Forms.maps.map 上显示选择器
- android - 使用 button.performClick() 时不会显示飞溅片段