如何在PostgreSQL中的WHERE子句中写入CASE WHEN?

pbgvytdp  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(2)|浏览(294)

如何在PostgreSQL中的WHERE子句中有一个CASE WHEN?
我不想扫描一个表的所有分区。根据变量,我只想扫描一个特定的分区。

  1. SELECT
  2. t.CUSTOMER_ID
  3. , CASE
  4. WHEN t.col1 = 'U' THEN 1
  5. WHEN t.col1 = 'E' THEN 2
  6. WHEN t.col1 = 'J' THEN 3
  7. ELSE 0 END AS col1_id
  8. , max(t.date) AS date
  9. FROM t
  10. WHERE
  11. date > CAST('${date}' AS TIMESTAMP)
  12. AND st = 'Y'
  13. and RSS = 'wallet'
  14. and cob NOT IN (1,2,3,4,5)
  15. AND CASE
  16. WHEN ${mp_id} IN (1,2,3) THEN col1 = 'U' --this CASE WHEN is not working
  17. WHEN ${mp_id} IN (4,5,6) THEN col1 = 'E'
  18. WHEN ${mp_id} IN (7,8,9) THEN col1 = 'J'
  19. END

字符串
如果变量${mp_id}在(1,2,3)中,我只扫描分区'U';如果变量${mp_id}在(4,5,6)中,我只扫描分区'E'。
在WHERE子句中,CASE WHEN的正确语法是什么?
谢谢你,谢谢

mbyulnm0

mbyulnm01#

像这样做:

  1. col1 = CASE
  2. WHEN ${mp_id} IN (1,2,3) THEN 'U'
  3. WHEN ${mp_id} IN (4,5,6) THEN 'E'
  4. WHEN ${mp_id} IN (7,8,9) THEN 'J'
  5. END

字符串
记住,CASE关键字是用于表达式的。它产生一个值;它不像if语句那样选择运行哪段代码。
我知道这个编辑现在已经很老了,但是它刚刚又出现在我的提要中,所以人们仍然可以看到它,今天我会用JOINa VALUES() expression来做这件事(它们不仅仅是针对INSERT语句!)

  1. FROM t
  2. INNER JOIN (VALUES
  3. ('U', 1), ('U', 2), ('U', 3),
  4. ('E', 4), ('E', 5), ('E', 6),
  5. ('J', 7), ('J', 8), ('J', 9)
  6. ) as map(mpID, rslt) ON map.mpID = ${mp_id} AND map.rslt = col1
  7. WHERE date > CAST('${date}' AS TIMESTAMP)
  8. AND st = 'Y'
  9. AND RSS = 'wallet'
  10. AND cob NOT IN (1,2,3,4,5)

展开查看全部
kqqjbcuj

kqqjbcuj2#

通常在WHERE子句中使用常规AND/OR而不是caseexpressions 会更好。

  1. WHERE
  2. date > CAST('${date}' AS TIMESTAMP)
  3. AND st = 'Y'
  4. and RSS = 'wallet'
  5. and cob NOT IN (1,2,3,4,5)
  6. AND ((${mp_id} IN (1,2,3) AND col1 = 'U') OR
  7. (${mp_id} IN (4,5,6) AND col1 = 'E') OR
  8. (${mp_id} IN (7,8,9) AND col1 = 'J'))

字符串

相关问题