我有这部分代码
WHERE p.id = m.id AND (
CASE
WHEN (c.match_text IS NOT NULL)
THEN (
(lower(p.station) LIKE '%'||c.match_text||'%')
OR
(
(lower(p.station) LIKE '%sealed in%')
AND
(lower(p.affected_units) LIKE '%'||c.match_text||'%')
)
)
WHEN(u.name LIKE '%Memory%')
THEN (
(lower(p.affected_fuels) LIKE '%nuclear%')
AND
Run Code Online (Sandbox Code Playgroud)
我在这里得到了错误(较低(p.station)LIKE'%'|| c.match_text ||'%')!!
这是为什么?
我在想这种方法可以解决这个问题:
WHEN (c.match_text IS NOT NULL)
THEN (
CASE WHEN
(lower(p.station) LIKE '%'||c.match_text||'%')
OR
(
(lower(p.station) LIKE '%sealed in%')
AND
(lower(p.affected_units) LIKE '%'||c.match_text||'%')
)
THEN true
ELSE false
END
)
Run Code Online (Sandbox Code Playgroud)
谢谢
CASE()基本上是一个翻译器:它返回给定条件集的值.您遇到的问题是您试图强制它返回BOOLEAN值.这不起作用,因为BOOLEAN不是有效的SQL数据类型.
所以我认为你必须将你的逻辑实现为嵌套的AND/OR子句.它有点粗糙但并不比你原来的陈述复杂得多.像这样的东西:
WHERE p.id = m.id
AND (
( c.match_text IS NOT NULL
AND ( lower(p.station) LIKE '%'||c.match_text||'%'
OR ( lower(p.station) LIKE '%sealed in%'
AND lower(p.affected_units) LIKE '%'||c.match_text||'%'
)
)
)
OR (u.name LIKE '%Memory%'
AND lower(p.affected_fuels) LIKE '%nuclear%'
AND ...
Run Code Online (Sandbox Code Playgroud)