sql - 如果在 postgresql 的 min 函数中使用 case 语句,它是如何工作的?
问题描述
我是初级网络开发人员。我正在研究 postgres,我对 case 语句的用例有疑问。
此查询查找与特定单词最匹配的数据的几行。
结果可以是多个。
在此查询中,排名值是根据每行的相似度使用 case 语句计算的。
据了解,case 语句返回一个与每次执行相匹配的值。
当在 min 和 window 函数中使用 case 语句时,我想知道如何找到结果。
给定的表 PostalCode 是..
|---------------------|------------------|
| pcode | name |
|---------------------|------------------|
| 100456 | a |
|---------------------|------------------|
| 111343 | b |
|---------------------|------------------|
| 101334 | c |
|---------------------|------------------|
| 100567 | d |
|---------------------|------------------|
| 102234 | e |
|---------------------|------------------|
查询是..
SELECT pcode,
name
FROM (SELECT pcode,
name,
CASE WHEN pcode = '100123' THEN 0
WHEN pcode = '10012%' THEN 1
WHEN pcode = '1001%' THEN 2
WHEN pcode = '100%' THEN 3
WHEN pcode = '10%' THEN 4
WHEN pcode = '1%' THEN 5
ELSE NULL END AS hit_code,
MIN(CASE WHEN pcode = '100123' THEN 0
WHEN pcode = '10012%' THEN 1
WHEN pcode = '1001%' THEN 2
WHEN pcode = '100%' THEN 3
WHEN pcode = '10%' THEN 4
WHEN pcode = '1%' THEN 5
ELSE NULL END)
OVER(ORDER BY CASE WHEN pcode = '100123' THEN 0
WHEN pcode = '10012%' THEN 1
WHEN pcode = '1001%' THEN 2
WHEN pcode = '100%' THEN 3
WHEN pcode = '10%' THEN 4
WHEN pcode = '1%' THEN 5
ELSE NULL END) AS min_code,
FROM PostalCODE) Foo
WHERE hit_code = min_code;
结果将是
|---------------------|------------------|
| pcode | name |
|---------------------|------------------|
| 100456 | a |
|---------------------|------------------|
| 100567 | d |
|---------------------|------------------|
我知道第一个case语句根据相似度返回不同的值。
案例结束后,调用了 MIN 函数,但它会返回什么?
我无法理解这种背景。
请帮我。
如果你帮助我,我什么都给不了你,但我想表达我诚挚的谢意。
谢谢阅读。
解决方案
如果你只想要一行,这会简单得多:
SELECT pcode, name
FROM PostalCODE pc CROSS JOIN LATERAL
(CASE WHEN pcode = '100123' THEN 0
WHEN pcode = '10012%' THEN 1
WHEN pcode = '1001%' THEN 2
WHEN pcode = '100%' THEN 3
WHEN pcode = '10%' THEN 4
WHEN pcode = '1%' THEN 5
END) v(hit_code)
ORDER BY hit_code ASC
LIMIT 1;
推荐阅读
- java - 我无法将 Firebase 实时数据库中的数据检索到字符串变量中
- javascript - 为什么我的 d3js 饼图中的弧标签模糊?
- javascript - DHTMLX 调度程序时间线视图 - 带有较长文本的标签不会出现在树模式中
- javascript - 如何检测操作系统是否支持“prefers-color-scheme”?
- angular - npm 构建在 ssr 上崩溃
- javascript - 响应在地图外没有变化
- javascript - (仅限 Safari)Axios 请求不会将 cookie 发送到 Node.js/Express REST API
- c++ - 当我执行一个用 C++ 编写的程序时,是否有一个独立于实现的模型来描述我的内存中的位和字节会发生什么?
- python - 如何将 3 个数字与在 Python 中仅使用 2 个变量的函数与我编写的代码进行比较
- c - Char ** 在递归添加时不断被覆盖