在带有联接 table 的 sqlite 中执行 select 时,别名列具有空值
When performing a select in sqlite with a joined table, an aliased column has a null value
我试图在 sqlite 中加入两个 tables,其中一列有一个别名,但是当我为该列添加别名时,它 returns 为空。
我有两个 table,像这样:
sqlite> SELECT * FROM series;
_id = 1
name = Castle
type = show
who = dan
disabled = 0
sqlite> SELECT * FROM series_meta;
meta_id = 1
series_id = 1
meta_name = year
meta_type = int
meta_text =
meta_int = 2009
现在,我尝试以下查询:SELECT _id, name, type, who, disabled, y.meta_int AS year FROM series LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
我得到:
_id = 1
name = Castle
type = show
who = dan
disabled = 0
year =
但是如果我去掉列别名 (SELECT _id, name, type, who, disabled, y.meta_int FROM series LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
),我会得到预期的结果:
_id = 1
name = Castle
type = show
who = dan
disabled = 0
meta_int = 2009
我已经在 Windows 7 上用 sqlite 3.8.8.2 试过了。我也用 python 试过了,结果完全一样。删除 table 别名也不会改变任何内容。
有没有办法让它与列别名一起使用?
当然,您可以根据需要使用任意多的列别名,实际上您在这里面临着不同的问题,这是 year
作为字段名称的用法。
如果 y.meta_int 被命名为 year
,结果将是 (null)
,而任何其他名称都可以:
SELECT _id, name, type, who, disabled, y.meta_int tyear
FROM series
LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
相同的结果没有加入但在这里。但不同的是,如果您使用 'year' 作为字段名称,您实际上根本不会得到任何结果。任何其他名称都可以:
SELECT _id, name, type, who, disabled, y.meta_int AS m_year
FROM series, series_meta AS y
WHERE _id=y.series_id AND y.meta_name="year";
希望对您有所帮助!
在SQL中,单引号用于字符串,双引号用于引用列名。
因此 y.meta_name="year"
将 y.meta_name
列的内容与 y.meta_int
列的内容进行比较。
为了与 MySQL 等有问题的数据库兼容,SQLite 还支持对带引号的列名使用单引号,对字符串使用双引号,但前提是区别明确。
您应该始终使用正确的 SQL 语法:
SELECT _id, name, type, who, disabled, y.meta_int AS year
FROM series
LEFT JOIN series_meta AS y ON _id=y.series_id
AND y.meta_name = 'year'
我试图在 sqlite 中加入两个 tables,其中一列有一个别名,但是当我为该列添加别名时,它 returns 为空。
我有两个 table,像这样:
sqlite> SELECT * FROM series;
_id = 1
name = Castle
type = show
who = dan
disabled = 0
sqlite> SELECT * FROM series_meta;
meta_id = 1
series_id = 1
meta_name = year
meta_type = int
meta_text =
meta_int = 2009
现在,我尝试以下查询:SELECT _id, name, type, who, disabled, y.meta_int AS year FROM series LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
我得到:
_id = 1
name = Castle
type = show
who = dan
disabled = 0
year =
但是如果我去掉列别名 (SELECT _id, name, type, who, disabled, y.meta_int FROM series LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
),我会得到预期的结果:
_id = 1
name = Castle
type = show
who = dan
disabled = 0
meta_int = 2009
我已经在 Windows 7 上用 sqlite 3.8.8.2 试过了。我也用 python 试过了,结果完全一样。删除 table 别名也不会改变任何内容。
有没有办法让它与列别名一起使用?
当然,您可以根据需要使用任意多的列别名,实际上您在这里面临着不同的问题,这是 year
作为字段名称的用法。
如果 y.meta_int 被命名为 year
,结果将是 (null)
,而任何其他名称都可以:
SELECT _id, name, type, who, disabled, y.meta_int tyear
FROM series
LEFT JOIN series_meta AS y ON _id=y.series_id AND y.meta_name="year";
相同的结果没有加入但在这里。但不同的是,如果您使用 'year' 作为字段名称,您实际上根本不会得到任何结果。任何其他名称都可以:
SELECT _id, name, type, who, disabled, y.meta_int AS m_year
FROM series, series_meta AS y
WHERE _id=y.series_id AND y.meta_name="year";
希望对您有所帮助!
在SQL中,单引号用于字符串,双引号用于引用列名。
因此 y.meta_name="year"
将 y.meta_name
列的内容与 y.meta_int
列的内容进行比较。
为了与 MySQL 等有问题的数据库兼容,SQLite 还支持对带引号的列名使用单引号,对字符串使用双引号,但前提是区别明确。 您应该始终使用正确的 SQL 语法:
SELECT _id, name, type, who, disabled, y.meta_int AS year
FROM series
LEFT JOIN series_meta AS y ON _id=y.series_id
AND y.meta_name = 'year'