Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite在连接时很棘手_Sql_Sqlite_If Statement_Left Join - Fatal编程技术网

SQLite在连接时很棘手

SQLite在连接时很棘手,sql,sqlite,if-statement,left-join,Sql,Sqlite,If Statement,Left Join,我有以下两个表格: T1(id、名称) T2(id,混合动力车) 我想做的是从T2中选择all,如果hybrid_col是数值的,则与T1连接。 基本上,hybrid_col包含对T1的id引用(在这种情况下,我希望从T1获取名称)或文本字符串(在这种情况下,我只需要hybrid_col) 请问我怎么做 谢谢。试试这个 select id, (case when ISNUMERIC(hybrid_col) = 1 then name else hybrid_col end) as custom_

我有以下两个表格:

T1(id、名称) T2(id,混合动力车)

我想做的是从T2中选择all,如果hybrid_col是数值的,则与T1连接。 基本上,hybrid_col包含对T1的id引用(在这种情况下,我希望从T1获取名称)或文本字符串(在这种情况下,我只需要hybrid_col)

请问我怎么做

谢谢。

试试这个

select id,
(case when ISNUMERIC(hybrid_col) = 1 then name
else hybrid_col end) as custom_col
from
(select T2.id,T2.hybrid_col,T1.name from T2 left join T1 on T2.id = T1.id) mytab

如果我理解得很好,这应该是:

SELECT
(
  CASE 
     WHEN T2.HYBRID_COL = T1.ID THEN T1.NAME
      ELSE T2.HYBRID_COL
   END
) AS COLUMN
T2, T1
WHERE T2.ID = T1.ID
and ISNUMERIC(T1.HYBRID_COL ) = 1

编辑:不知道您是否正在查找ISNUMERIC,因为T1.ID是数字的,如果是这种情况,只需删除
和ISNUMERIC(T1.HYBRID\u COL)=1
它无论如何都应该工作,因为select验证
T2.HYBDRID\u COL
T1.ID

匹配。另一种方法是仅合并两种情况:

SELECT id, hybrid_col
FROM T2
WHERE hybrid_col+0!=hybrid_col
UNION
SELECT T2.id,t1.name
FROM T2 INNER JOIN T1 ON T2.hybrid_col=T1.id;
如果hybrid_col与T1.ID匹配,则无需检查它是否为数字。如果T1.ID始终为数字,则联接中将不包含非数字

编辑:要对其进行排序,请封装结果并对其进行排序:

SELECT ID, VALUE
FROM
(
    SELECT id as "ID", hybrid_col as "Value"
    FROM T2
    WHERE hybrid_col+0!=hybrid_col
    UNION
    SELECT T2.id as "ID",t1.name as "Value"
    FROM T2 INNER JOIN T1 ON T2.hybrid_col=T1.id
) Q
ORDER BY ID;

还有其他方法,比如将结果管道化到临时表中并进行查询,但上述方法可能是最简单的一种查询方法。

这应该可以在不使用ISNUMERIC的情况下工作(在SQLite中不可用)


这应该适合您,但由于类型转换,您可能会失去在T1.id上建立索引的任何好处,您如何加入它们?使用T1.ID和T2.ID?或者只是在T2.hybridcol等于T1.ID时使用hybridcol?遗憾的是,SQLite中没有
ISNUMERIC
函数。这很有效,谢谢MPelletier。只有两个问题:我应该担心使用它的速度吗?如何按T1中的列对结果进行排序并使其混合(我指的是两个选择中的元素)。速度主要取决于总共有多少数据,以及对hybrid_col和T1.id的索引。至于排序,请参阅我的编辑。@Francisc,这取决于它们的结构,是的,我认为是这样。您知道为什么大多数SQL数据库引擎不支持混合列类型吗?因为事情不是这样的。一个结构良好的关系数据库应该有每个只包含一项的列。我也反对混合列。我现在重做数据库的这一部分可能是最好的,因为它还处于初级阶段,而不是以后它会变得非常复杂。谢谢。一定要花时间来设计这个部件,特别是如果你有机会的话。如果一些T2条目需要T1条目,则将其设置为专用字段,或者为所有T2条目指定一个T1,或者将其全部放在T2中。
SELECT IFNULL(T1.name, T2.hybrid_col) AS [name]
FROM T2
    LEFT OUTER JOIN T1 ON CAST(T1.id AS VARCHAR) = T2.hybrid_col