引用SQLite case语句中的列
我有一个名为引用SQLite case语句中的列,sql,sqlite,Sql,Sqlite,我有一个名为table的SQLite表。它有4列:列1、列2、列3、列4 如果我用MySQL来解释我想做什么,它是这样的: SELECT CASE WHEN col_4 IS NOT NULL THEN col_4, WHEN col_3 IS NOT NULL THEN (CONCAT COL_3 and COL_2) ELSE (CONCAT STRING + col_2) END AS clue FROM TABLE 基本上,我想做的是,如果有值,选择col_4的值。如果没有,则
table
的SQLite表。它有4列:列1、列2、列3、列4
如果我用MySQL来解释我想做什么,它是这样的:
SELECT CASE
WHEN col_4 IS NOT NULL THEN col_4,
WHEN col_3 IS NOT NULL THEN (CONCAT COL_3 and COL_2)
ELSE (CONCAT STRING + col_2)
END AS clue
FROM TABLE
基本上,我想做的是,如果有值,选择col_4
的值。如果没有,则检查列3
中是否有值。如果有,则将col_3
和col_2
的值串联起来。如果这也是null,那么将一个字符串与col_2
的值连接起来(根据我的设计,它永远不会为null)
为了尝试实现这一点,我编写了以下SQLite查询:
select CASE col_4
WHEN NOT NULL col_4
ELSE CASE col_3
WHEN NOT NULL col_3 || ' - ' || col_2
ELSE'String: ' || col_2 END AS clue
FROM table
但是当在SQLite视图中在线运行它时,它在第一个case语句中就失败了
它不允许我在非空col_4时执行CASE col_4
,即从语句中的列返回值。它让我编写一个特定的字符串,这不是我想要的
是否有一种方法可以解决这个问题?对于这种特定情况,嵌套一些
IFNULL()
函数可能会更容易,运行速度也会更快,尽管我确信case表达式可以工作,但它可能会很长且复杂
SELECT IFNULL(COL_4, IFNULL(COL_3||COL_2, 'String: ' || COL_2))
FROM TABLE
该函数检查第一个参数/列是否有值,如果没有值,则返回第二个插槽中的值。在这种情况下,如果第一列为空,则运行嵌套函数。对于嵌套一些
IFNULL()的特定情况,可以找到其他信息
函数可能会更简单,运行速度也会更快,尽管我确信case表达式可以工作,但它可能会很长且复杂
SELECT IFNULL(COL_4, IFNULL(COL_3||COL_2, 'String: ' || COL_2))
FROM TABLE
该函数检查第一个参数/列是否有值,如果没有,则返回第二个插槽中的值。在这种情况下,如果第一列为空,则运行嵌套函数。可以找到其他信息。用于
case
的语法错误。将其更改为:
SELECT CASE
WHEN COL_4 IS NOT NULL THEN col_4,
WHEN COL_3 IS NOT NULL THEN COL_3 || '-' || COL_2
ELSE 'String: ' || COL_2
END AS clue
FROM TABLE
请记住,如果两个值中的任何一个值为NULL
,则两个值串联的结果为NULL
因此,如果COL_2
为NULL
,则CASE
表达式的最后两个分支的结果也将为NULL
如果COL_2
不能为NULL
,则可以将代码简化为:
SELECT COALESCE(COL_4, COL_3 || '-' || COL_2, 'String: ' || COL_2)
FROM TABLE
用于
大小写的语法错误。
将其更改为:
SELECT CASE
WHEN COL_4 IS NOT NULL THEN col_4,
WHEN COL_3 IS NOT NULL THEN COL_3 || '-' || COL_2
ELSE 'String: ' || COL_2
END AS clue
FROM TABLE
请记住,如果两个值中的任何一个值为NULL
,则两个值串联的结果为NULL
因此,如果COL_2
为NULL
,则CASE
表达式的最后两个分支的结果也将为NULL
如果COL_2
不能为NULL
,则可以将代码简化为:
SELECT COALESCE(COL_4, COL_3 || '-' || COL_2, 'String: ' || COL_2)
FROM TABLE
我会尝试COALESCE(col4,COALESCE(col3,'string')| col2)
BTW,case
表达式,而不是语句。我会尝试COALESCE(col4,COALESCE(col3,'string')| col2)
BTW,case
表达式,而不是语句。谢谢你。我现在遇到的问题是如果我运行“从表中选择col 4,col 2”,它没有给出col_4的任何信息,也没有给出col_2的输出。这是正确的。但是,只要我添加COALESCE()在它周围,它只是输出一个空白,没有给我选择的余地。在coalesce中第二个选项中肯定有一些东西,因为我可以自己把它拉出来。你知道为什么会发生这种情况吗?如果你的意思是选择coalesce(col_4,col_2)from table在col_2从不为空时不返回任何内容这意味着col_4或col_2为空(不为空),请选中选择长度(col_4)、长度(col_2)从表中
这正是我的意思,我选中了它,它是空的!要创建数据库,所有的值都是从.csv上传的。我假设任何空值都是空的,但它们是空的。那么有没有其他方法可以忽略空白?比如“IFBLANK()”或者我必须回到我的INSERT语句吗?你能做的最好的事情就是更新表:updatetable set col_4=null,其中trim(col_4)=''
Hi谢谢你。我现在遇到的问题是如果我运行“select col_4,col_2 from table”,它没有给出col_4的任何信息,也没有给出col_2的输出。这是正确的。但是,只要我添加COALESCE()在它周围,它只是输出一个空白,没有给我选择的余地。在coalesce中第二个选项中肯定有一些东西,因为我可以自己把它拉出来。你知道为什么会发生这种情况吗?如果你的意思是选择coalesce(col_4,col_2)from table在col_2从不为空时不返回任何内容这意味着col_4或col_2为空(不为空),请选中选择长度(col_4)、长度(col_2)从表中
这正是我的意思,我选中了它,它是空的!要创建数据库,所有的值都是从.csv上传的。我假设任何空值都是空的,但它们是空的。那么有没有其他方法可以忽略空白?比如“IFBLANK()”或者我必须返回INSERT语句吗?您所能做的最好的事情就是更新表:updatetable set col_4=null,其中trim(col_4)='