我有一张桌子,上面有以下内容:
Columns:
---
URL [nullable, e.g. "https://dba.stackexchange.com/"]
APPFK [nullable, e.g. 654654]
LINKTYPE ["Page", "Link", or "App"]
Check Constraints:
---
(URL IS NULL AND LINKTYPE <> "Link") OR (URL IS NOT NULL AND LINKTYPE = "Link")
(APPFK IS NULL AND LINKTYPE <> "App") OR (APPFK IS NOT NULL AND LINKTYPE = "App")
由于可以根据 URL 和 APPFK 的可空性计算 LinkType,我认为这是计算/生成/虚拟列的绝佳机会。
所以,我试图运行:
alter table MYLIB.MYTABLE
add column testcol VARCHAR(4) generated always as
(
CASE
WHEN URL IS NOT NULL THEN 'LINK'
WHEN APPFK IS NOT NULL THEN 'APP'
ELSE 'PAGE'
END
)
Annnd DB2 向我吐口水:
SQL 状态:42601 供应商代码:-104 消息:[SQL0104] 令牌(无效。有效令牌:IDENTITY。原因......:在令牌(。令牌(不是有效令牌。A有效标记的部分列表是 IDENTITY。此列表假定该语句在该标记之前是正确的。错误可能在该语句的早期,但该语句的语法在此之前似乎是有效的。恢复...:执行以下一项或多项操作并再次尝试请求: -- 验证令牌区域中的 SQL 语句 (。更正语句。错误可能是缺少逗号或引号,也可能是拼写错误的单词,或者它可能与子句的顺序有关。- 如果错误标记是 ,请更正 SQL 语句,因为它没有以有效的子句结尾。
我尝试运行此 DB2 文档中的第一个示例,但它给了我同样的错误。
怎么了,这里?难道我做错了什么?文档有错吗?仅仅是因为我们的 DB2 已经过时(我们运行的是版本 7,修订版 1),如果是,是否有解决方法?
不同平台的 Db2 版本往往具有不同的特性和语句语法细节,因此您应该始终查阅文档以了解您的确切数据库版本和平台。如果这样做,您将看到只能对生成的列使用有限的表达式选择——标识或行更改时间戳。
我建议您使用
CASE
表达式创建一个视图,而不是生成的列,以获取额外的列。Db2 的平台和版本是什么?
您链接到的文档适用于 Db2 for Linux/Unix/Windows(又名 LUW)。
该
db2-midrange
标记适用于 IBM i 的 Db2,其CREATE TABLE 文档显示只能生成以下列。注意:最后四个相对较新,基本上是为了支持最新版本的 Db2 for IBM i (7.4) 中的临时表而添加的
最后一个可能看起来像您正在尝试但更深入地挖掘,“生成的表达式”是以下“非确定性表达式”之一