如何使用 dashDB 表中名为 _id 的列?

Posted

技术标签:

【中文标题】如何使用 dashDB 表中名为 _id 的列?【英文标题】:How can I use a column named _id from a dashDB table? 【发布时间】:2017-03-22 18:17:09 【问题描述】:

我在 Cloudant 中有一个文档 ID 为 _id 的数据库。

将此数据从 Cloudant 复制到 dashDB 后,我有 2 个单独的表,我想使用此 _id 列加入它们。在运行 SQL 我尝试了以下,但这不会运行。我在这里想念什么?是否需要将列名 _id 替换为不带下划线的名称?

select m.title, m.year, g.value 
from MOVIES m
inner join MOVIES_GENRE g on m._ID = g._ID;

【问题讨论】:

您是否收到特定错误?如果您怀疑它是列名 _id,您可以尝试在它周围加上双引号以表明它是一个对象名称:inner join MOVIES_GENRE g on m."_ID" = g."_ID"; 如果可能的话,建议将这些列重命名为更标准的格式。 【参考方案1】:

TL;DR:正如@gmiley 指出的那样,问题是由_ID 列名引起的,这不是一个普通的标识符(见下面的定义),因此需要用双引号括起来在 SQL 语句中引用 "_ID" 或单引号 '_ID'

select m.title, m.year, g.value 
from MOVIES m
inner join MOVIES_GENRE g on m."_ID" = g."_ID";

与普通标识符不同带引号的标识符区分大小写"_id""_ID" 不同,而titleTITLE 相同)。如果您要在语句中指定 "_id",则会引发错误,指示未找到该列。

由于您提到您已使用Cloudant warehousing process 来填充您的 DashDB 表,因此可能值得一提的是,在模式发现期间生成 DDL 时,属性名称是大写的。

示例:具有此结构的 JSON 文档的内容

 
  "_id": "000018723bdb4f2b06f830f676cfafd6",
  "_rev": "1-91f98642f125315b929be5b5436530e7",
  "date_received": "2016-12-04T17:46:47.090Z",
  ...
  

将映射到三列:

_ID 类型为 VARCHAR(...) _REV 类型为 VARCHAR(...) DATE_RECEIVED 类型 ... ...

希望这会有所帮助!


来自DB2 SQL reference:

普通标识符是一个大写字母后跟零个或多个字符,每个字符是一个大写字母、一个数字或下划线字符。请注意,在指定普通标识符时可以使用小写字母,但在处理时会转换为大写字母。普通标识符不应是保留字。

示例:WKLYSALWKLY_SAL

分隔标识符是由一个或多个字符组成的序列 双引号。序列中的前导空白很重要。 序列中的尾随空白不重要,尽管它们已存储 与标识符。两个连续的引号用于表示 分隔标识符中的一个引号。这样一个标识符 可以包含小写字母。

示例: "WKLY_SAL""WKLY SAL""UNION""wkly_sal"

【讨论】:

以上是关于如何使用 dashDB 表中名为 _id 的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何基于sas中的列合并表[重复]

仅当记录匹配时才从另一个表中更新记录

PHP/MySQL 连接语句

wordpress 主题定制器下拉菜单

SQL:根据另一个表的计数结果更新一个表中的列

具有 NULL 值的 DashDB DB2 UNIQUE