SQLite中CASE WHEN THEN返回0值问题(.NET应用场景)
问题诊断与解决方案
我一眼就看出问题所在了——你在SQLite里用了+来做字符串拼接,但SQLite的+是算术加法运算符,不是字符串拼接符!这就是为什么你得到的全是0,而不是预期的字符串组合。
为什么会返回0?
SQLite在遇到+时会尝试把两边的操作数当作数字来计算。你的CASE语句返回的都是字符串(比如'_'、'R_'、'F41A'这类),当SQLite试图把这些字符串转成数字时会失败,失败后就会用0来代替每个部分。所有0加起来自然还是0,这就是你看到全0结果的原因。
修正后的查询语句
SQLite中正确的字符串拼接运算符是||,把你查询里所有的+替换成||就可以得到预期结果了:
select (CASE IFNULL(CCODE_1, '') when 'STD' then '_' else '' end) || (CASE IFNULL(CFRRR_CS, '') when '1' then 'F_' when '2' then 'R_' when '3' then 'FR_' else '' end) || IFNULL(CCODE_1, '') || (CASE when (IFNULL(CCODE_2, '') = '') then '' else '_' end) || IFNULL(CCODE_2, '') || (CASE when (IFNULL(CCODE_3, '') = '') then '' else '_' end) || IFNULL(CCODE_3, '') as OptionID from X20_TIRES
补充说明
很多其他关系型数据库(比如SQL Server、MySQL在特定模式下)确实支持用+拼接字符串,但SQLite坚持使用标准SQL的||作为字符串连接符,这是很容易踩的一个跨数据库语法坑。你原来的CASE逻辑本身是没问题的,只是拼接方式用错了运算符而已。
内容的提问来源于stack exchange,提问作者HerrimanCoder
相关产品推荐
相关产品推荐

