mysql 如果存在 return 记录值而不是常规输出
mysql if exists return the record value instead of regular output
我想要 select if/exists 它 returns 'link' 值而不是常规输出。
所以 returns 而不是 '1' 'link'
这可能吗?
SELECT IF(
EXISTS(
SELECT link FROM modules WHERE module='license'
), 1, '/dashboard/'
)
对 MAX()
(或 MIN()
)使用聚合:
SELECT COALESCE(MAX(link), '/dashboard/') link
FROM modules
WHERE module = 'license';
如果 link
在 modules
中不存在,那么 MAX()
将 return null
在这种情况下 COALESCE()
将 return '/dashboard/'
.
@forpas 的解决方案是正确的,但是如果 table 很大,选择 MAX(link)
会变慢。我们不需要计算最大值,因为我们只对满足条件的 link
的存在感兴趣。
这是一个更复杂但更快捷的解决方案:
SELECT COALESCE(t2.link, '/dashboard/')
FROM
(
SELECT 1 AS foo
) t
LEFT JOIN (
SELECT link
FROM modules
WHERE module='license' AND
(NOT (link IS NULL))
LIMIT 0, 1
) t2
ON 1 = 1
解释:
- 我们离开加入了一个虚拟 table 与一个生成的关系,如果它们存在你需要的链接
t
是一个虚拟 table 并且即使 t2
为空 也能得到结果
t2
如果没有符合条件的记录就会有0条记录
如果至少有一条记录符合条件,t2
将拥有您需要的所有链接
- 如果有多个记录符合条件并且您需要它们,那么您可以从
t2
中删除 LIMIT
子句
LIMIT
确保在找到第一个匹配项时停止搜索,而不是搜索最大值
我想要 select if/exists 它 returns 'link' 值而不是常规输出。 所以 returns 而不是 '1' 'link'
这可能吗?
SELECT IF(
EXISTS(
SELECT link FROM modules WHERE module='license'
), 1, '/dashboard/'
)
对 MAX()
(或 MIN()
)使用聚合:
SELECT COALESCE(MAX(link), '/dashboard/') link
FROM modules
WHERE module = 'license';
如果 link
在 modules
中不存在,那么 MAX()
将 return null
在这种情况下 COALESCE()
将 return '/dashboard/'
.
@forpas 的解决方案是正确的,但是如果 table 很大,选择 MAX(link)
会变慢。我们不需要计算最大值,因为我们只对满足条件的 link
的存在感兴趣。
这是一个更复杂但更快捷的解决方案:
SELECT COALESCE(t2.link, '/dashboard/')
FROM
(
SELECT 1 AS foo
) t
LEFT JOIN (
SELECT link
FROM modules
WHERE module='license' AND
(NOT (link IS NULL))
LIMIT 0, 1
) t2
ON 1 = 1
解释:
- 我们离开加入了一个虚拟 table 与一个生成的关系,如果它们存在你需要的链接
t
是一个虚拟 table 并且即使t2
为空 也能得到结果
t2
如果没有符合条件的记录就会有0条记录
如果至少有一条记录符合条件,t2
将拥有您需要的所有链接- 如果有多个记录符合条件并且您需要它们,那么您可以从
t2
中删除 LIMIT
确保在找到第一个匹配项时停止搜索,而不是搜索最大值
LIMIT
子句