引用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)='