我正在尝试运行一个匹配空值的多列in子句。现在我正在使用coalesce:
select * from table
where (coalesce(foo, ''), coalesce(bar, '')) in (('foo_val', 'bar_val'), ('foo_val', ''));
但是对于整数列,这会抛出整数的无效输入语法:coalesce上的“”“。我可以合并到-1而不是空字符串,但是想知道是否有更优雅的解决方案。
样本输入/输出:
表数据:
{{foo:1,bar:2},{foo:1,bar:NULL}}
用户输入:[(1,2),(1,nil)]
预期输出:两行。
编辑:我将尝试澄清我正在尝试做什么:我希望通过用户给出的多个列值组合来匹配数据库行。也就是说,如果用户输入[(1,2),(3,4)],我想要返回其中column_A == 1 AND column_B == 2,OR column_A == 3 AND column_B == 4的行。我遇到麻烦的地方是允许用户输入NULL并使其匹配任何其他值。因此,如果用户输入[(1,NULL)],我想要返回其中column_A == 1 AND column_B == NULL的行(但请注意我不想为先前的查询返回它们,因为用户没有在column_B中指定他想要具有NULL值的行。)
答案 0 :(得分:0)
此代码不仅匹配空值,还会匹配空字符串。如果这就是你想要的,那就好了。
在IN子句中使用硬编码列表,您希望也返回空值,最简单的解决方案是合并IN列表中的第一个值。这样您就不必担心匹配列表中不存在的非空值(如空字符串或-1)。
select *
from table
where (coalesce(foo, 'foo_val'), coalesce(bar, 'foo_val'))
in (('foo_val', 'bar_val'), ('foo_val', ''));