SQL:CASE中能否用IN子句?IN查询无返回结果问题排查
问题解答:CASE语句中使用IN子句及查询无结果原因
1. CASE语句中可以使用IN子句吗?
当然可以。CASE语句的WHEN条件完全支持IN操作符,比如你可以这样写:
CASE WHEN column2 IN ('a', 'b', 'c') THEN 1 ELSE 2 END
你当前的CASE逻辑用于排序,和WHERE子句的IN问题无关,写法本身没问题。
2. 第一段查询无结果的原因
问题出在Python字符串格式化生成的IN子句格式错误。假设你的list_of_values是类似['v1', 'v2', 'v3']的列表,直接用'{list_of_values}'插入SQL后,生成的WHERE子句会变成:
where column1 in ('['v1', 'v2', 'v3']')
这相当于把整个列表的字符串表示(包括方括号、引号)当作单个值去匹配column1,而你的数据里column1根本没有这个值,自然查不到结果。
而用column1 = '{value1}'时,格式化后是正常的单值匹配(比如column1 = 'v1'),所以能返回正确结果。
正确的处理方式
- 推荐:使用参数化查询(避免SQL注入,也不会有格式问题),比如用psycopg2的话可以这么写:
sql_query = """SELECT * FROM table1 where column1 = ANY(%s) order by CASE WHEN column2 like'a%' THEN 1 WHEN column2 like'b%' THEN 2 WHEN column2 like'c%' THEN 3 ELSE 99 END;""" cursor.execute(sql_query, (list_of_values,))
- 如果一定要用字符串拼接(不推荐,存在SQL注入风险),可以手动把列表转成逗号分隔的字符串:
formatted_values = "','".join(list_of_values) sql_query = f"""SELECT * FROM table1 where column1 in ('{formatted_values}') order by CASE WHEN column2 like'a%' THEN 1 WHEN column2 like'b%' THEN 2 WHEN column2 like'c%' THEN 3 ELSE 99 END;"""
内容的提问来源于stack exchange,提问作者Tanu
相关产品推荐
相关产品推荐

