临床查询语言(CQL)引用
可以使用临床查询语言(CQL)访问、检索 Veeva 临床数据库(CDB)中的临床数据并与之交互。本指南详细介绍了如何最佳利用 CQL,并概述了其语法、结构、子句和运算符。虽然 CQL 查询与结构化查询语言(SQL)共享许多语法元素,但 CQL 语句允许使用精简的、以临床为中心的语法专门针对 EDC 数据执行查询。
可用性:临床数据库(CDB)仅对 CDB 许可证持有者提供。请联系 Veeva 服务代表了解详细信息。
在 CDB Workbench 中查询数据时,它会传递一个 CQL 语句,该语句指定要在 FROM 子句中查询的对象、要在 SELECT 子句中检索的字段以及要应用的任何可选筛选(在 WHERE 子句中)。
以下示例查询返回 Cholecap 2019 1 期研究中人口统计信息和入选标准表单的所有数据条目。
SELECT * FROM F.Demographics, F.Inclusion_Criteria
CQL 的临床上下文
CQL 理解常见的临床数据模式和关系。这种“上下文”提供了一种比通用查询语言(如 SQL)更简单的语言语法。CQL 理解以下预定义的对象和关系:
上下文元素 | 描述 | 示例 |
---|---|---|
研究 | 所有临床数据都在一个研究的上下文中收集,该研究具有预定义的时间点和数据结构,以及用于收集、审查、清理和锁定这些数据的预定义工作流。 |
IMG-0314-A、TEL2019-1 |
研究中心 | 收集临床数据的研究中心。 |
101 |
国家/地区 | 研究中心所在国家/地区(由 Vault EDC 中的研究国家/地区对象表示)。 |
美国、英国 |
受试者 | 临床试验中的所有临床数据都是针对入组该研究的受试者收集的。 |
1001, 1002 |
事件 | 所有数据都在特定收集点的上下文中收集。这个收集点称为“事件”。通常与“访视”相对应。 |
入组访视、访视 1、访视 2 |
标题 | 在给定收集点(事件)收集的有关受试者的所有表单共享相同的上下文。可以使用标题查询此上下文。标题是返回所有存在于 Workbench 对象层级中表单上方的上下文对象的快捷方式。 |
@HDR |
表单 | 在表单中收集的数据条目的集合。 |
生命体征、病史 |
数据条目 | 在研究特定收集点收集的有关受试者的特定数据元素(条目)。 |
出生日期、收缩压、眼睛颜色 |
属性 | 上述所有上下文元素都具有描述元素各个方面的额外属性。这些属性可以表示对象的状态或基本信息,例如条目的名称或上次修改日期。元素的大多数属性通过函数()返回,但一些基本属性(如名称、ID 等)可以使用点符号返回。 |
Locked(事件 1)、Item1.ID |
可查询数据
在利用 CQL 创建查询时,了解哪些数据是可查询的以及这些数据的结构非常重要。可以使用 DESCRIBE
和 SHOW
关键字来返回 CQL 的可查询数据列表。
描述(Describe)
可以使用 DESCRIBE
关键字来创建一个查询,以获取关于提要的详细信息。
CQL 支持以下数据元素的 DESCRIBE
:
HEADER
FORM
ITEMGROUP
ITEM
REFERENCE_OBJECT
调用 DESCRIBE
时,CQL 会返回表格或对象中的每个字段。
DESCRIBE 表单
对表单调用 DESCRIBE 将返回表单中包含的所有条目(包括名称和数据类型)的列表。
DESCRIBE Form VITALS
此查询会返回 Cholecap 2019 - 1 期研究中生命体征表单上所有条目的列表。
名称 | 数据类型 | |
---|---|---|
表单 | Form.Name | 文本(100) |
Form.SeqNbr | Int(整数) | |
项组 | ItemGroup.Name | 文本(100) |
ItemGroup.SeqNbr | Int(整数) | |
条目 | Pulse | Int(整数) |
条目 | Systolic_Blood_Pressure(收缩压) | 文本(255) |
条目 | Diastolic_Blood_Pressure(舒张压) | 文本(255) |
条目 | Temperature(体温) | Int(整数) |
显示(Show)
还可以使用 SHOW
关键字来创建一个查询,获取可能值的列表。可以将 SHOW
应用于事件组、事件、表单和代码列表条目。还可以使用 SHOW
来返回当前 Vault 中的研究的列表。
显示研究
可以使用 SHOW
来返回当前 Vault 中的研究的列表:
SHOW STUDIES
显示事件组
可以使用 SHOW
来返回当前研究中的事件组列表:
SHOW EVENTGROUPS
显示事件
可以使用 SHOW
来返回当前研究中的事件列表:
SHOW EVENTS
显示表单
可以使用 SHOW
来返回当前研究中的表单列表:
SHOW FORMS
显示代码列表条目
可以使用 SHOW
来返回给定代码列表中的代码列表条目列表。请注意,必须提供代码列表类型数据条目的名称。
SHOW CODELIST <DATAITEM>
显示视图
可以使用 SHOW
来返回研究中的视图列表。
SHOW Views
显示参考
可以使用 SHOW
来返回研究中的参考对象列表。
SHOW Reference
系统列表
可以使用 CALL
通过 CQL 访问系统列表。系统列表是为原始类型导出生成的列表,其中包含有关研究和所收集数据的上下文信息。
- Sys_Sites:
CALL Sys_Sites
- Sys_Subjects:
CALL Sys_Subjects
- Sys_Events:
CALL Sys_Events
- Sys_Forms:
CALL Sys_Forms
- Sys_ILB:
CALL Sys_ILB
- Sys_Links:
CALL Sys_Links
视图
可以使用 SHOW VIEWS 通过 CQL 访问视图
。这将返回当前研究中所有现有视图的列表。视图是专门的列表。在编写用于其他视图的 CQL 时,还可以引用选择中的视图。为此,请使用视图的名称(标题)作为源。
定义视图时的 CQL 限制
定义视图时,不支持以下 CQL 功能:
select *
UnPivot()
- 重复的列别名
- 投影中除
@Form.SeqNbr
之外的其他@Form
属性 - 投影中除
@ItemGroup.SeqNbr
之外的其他@ItemGroup
属性
引用视图时的 CQL 限制
在自定义列表中引用视图时,存在以下限制:
- 不支持在另一个视图内部引用视图。
- 投影或过滤器(
WHERE
子句)中不支持包含视图的@Form
和@ItemGroup
属性。 - 如果使用
On Subject ALIGN
,则视图不得使用UNALIGN
。 - 在将视图与另一个表单或视图连接时,如果使用
On Subject
,视图必须使用On Subject
。
视图中的 On Subject 连接
在将视图与另一个表单或视图连接时,视图支持使用 On Subject ALIGN
和 On Subject UNALIGN
。
要在视图和表单之间执行 on subject 连接,视图的视图定义必须包含 On Subject
。否则,CQL 将返回以下错误提示:
“视图只能按其定义的方式进行连接。请确保视图定义和视图引用中的 On Subject 对齐方式相同。“
使用 On Subject ALIGN 的视图定义
以下视图定义会检索受试者在发生不良事件时所使用的药物。这个视图称为”View_AE_CM\OnSubjectALIGN“:
select @HDR.Site.Name, @HDR.Subject.Name, @Form.SeqNbr, @ItemGroup.SeqNbr, ae.AETERM, ae.AESTDAT, ae.AEONGO, ae.AEENDAT, ae.AESEV, cm.CMTRT, cm.CMSTDAT, cm.CMONGO, cm.CMENDDAT from AdverseEvent as ae, ConcomitantMedication as cm On Subject ALIGN where (@Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v')) and AETERM is not null order by @HDR.Subject.Name, @Form.SeqNbr
现在,这个视图可以与另一个表单、生命体征连接,以获取这些受试者的身高、体重或 BMI 等生命体征。可以使用 On Subject ALIGN
和 On Subject UNALIGN
来进行这种连接。
select @HDR.Site.Name, @HDR.Subject.Name, @Form.SeqNbr, @ItemGroup.SeqNbr, algn.AETERM, algn.AESTDAT, algn.AEONGO, algn.AEENDAT, algn.AESEV, algn.CMTRT, algn.CMSTDAT, algn.CMONGO, algn.CMENDDAT, vtls.HEIGHT, vtls.WEIGHT, vtls.BMI, vtls.SYSBP from View_AE_CM_OnSubjectALIGN as algn, VitalSigns as vtls On Subject ALIGN where (@Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v'))
select @HDR.Site.Name, @HDR.Subject.Name, @Form.SeqNbr, @ItemGroup.SeqNbr, algn.AETERM, algn.AESTDAT, algn.AEONGO, algn.AEENDAT, algn.AESEV, algn.CMTRT, algn.CMSTDAT, algn.CMONGO, algn.CMENDDAT, vtls.HEIGHT, vtls.WEIGHT, vtls.BMI, vtls.SYSBP from View_AE_CM_OnSubjectALIGN as algn, VitalSigns as vtls On Subject UNALIGN where (@Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v'))
使用 On Subject UNALIGN 的视图定义
以下视图定义会检索受试者在发生不良事件时所使用的药物。这个视图称为”View_AE_CM\OnSubjectUNALIGN“:
select @HDR.Site.Name, @HDR.Subject.Name, @Form.SeqNbr, @ItemGroup.SeqNbr, ae.AETERM, ae.AESTDAT, ae.AEONGO, ae.AEENDAT, ae.AESEV, cm.CMTRT, cm.CMSTDAT, cm.CMONGO, cm.CMENDDAT from AdverseEvent as ae, ConcomitantMedication as cm On Subject UNALIGN where (@Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v')) and AETERM is not null order by @HDR.Subject.Name, @Form.SeqNbr
定义中包含 On Subject UNALIGN
的视图只能与使用 On Subject UNALIGN
的另一个表单进行连接,如下所示:
select @HDR.Site.Name, @HDR.Subject.Name, @Form.SeqNbr, @ItemGroup.SeqNbr, unalgn.AETERM, unalgn.AESTDAT, unalgn.AEONGO, unalgn.AEENDAT, unalgn.AESEV, unalgn.CMTRT, unalgn.CMSTDAT, unalgn.CMONGO, unalgn.CMENDDAT, vtls.HEIGHT, vtls.WEIGHT, vtls.BMI, vtls.SYSBP from View_AE_CM_OnSubjectALIGN as unalgn, VitalSigns as vtls On Subject UNALIGN where (@Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v'))
参考对象
要检索研究中的所有参考对象列表,请使用 SHOW
关键字:
SHOW Reference
然后,可以使用 DESCRIBE
关键字来检索给定参考对象上的条目列表:
DESCRIBE Reference <Reference_Object_Name>
使用 ReferenceRelations
关键字检索以下属性的键值对表:reference_object_name
,related_form
, related_item
, and related_key
。
ReferenceRelations <Reference_Object_Name>
对于文本类型的参考对象条目,CQL 支持以下函数:
CONCAT
LENGTH
TRIM
LTRIM
RTRIM
UPPER
LOWER
LEFT
RIGHT
对于日期类型的参考对象条目,CQL 支持以下函数:
ADDDATE
SUBDATE
DATEDIFF
DATE_FORMAT
SITENORMALIZEDDATE
RAWDATE
SDTMDATEFORMAT
STR_TO_DATE
CURDATE
NOW
YEAR
MONTH
WEEK
DAY
HOUR
MINUTE
SECOND
LAST_DAY
参考对象的 CQL 限制
使用参考对象时,CQL 限制适用。
以下函数不能与参考数据一起使用:
FROZEN
ILB
LABEL
LASTCODED
LASTMODIFIEDDATE
LOCKED
SIGNED
STATUS
查询语法和结构&
CQL 查询返回一个元组:一个具有已定义列顺序的数据表。为了返回一个元组,CQL 查询必须指定以下内容:
- 投影:要检索的特定数据元素。
- 选择:包含投影中数据元素的特定数据表。
- 过滤器(可选):要返回的数据元素的匹配标准(这些不必包含在元组中,可以通过研究中的隐式关系进行引用)。
- 排序(可选):元组中行的返回顺序。
投影
CQL 查询的投影指定要检索的数据元素以及这些元素在结果集中的顺序。可以使用 DATAITEM
名称显式指定字段列表,也可以使用通配符快捷方式。
使用 SELECT
语句描述投影。
通配符
可以在 SELECT
语句中使用通配符星号,以布局顺序返回 FROM 子句中指定 FROM 上下文中关联 DATAITEMS
的所有列。
SELECT * FROM Demographics
上下文限定星号
可以使用上下文限定星号来返回限定符上下文中的所有 DATAITEMS
,而不是使用通配符星号。
在当前版本中,仅支持 FORM
和 ITEMGROUP
限定符。
SELECT <Qualifier>.* FROM <Form_Name> SELECT Creation_Criteria.* FROM Demographics
此示例查询会返回 Cholecap 2019 1 期研究中人口统计信息表单上创建标准条目组中的所有 DATAITEMS
。
数据条目
或者,可以指定要检索的特定 DATAITEMS。可以在投影中选择存在于指定 FORM 中的任何 DATAITEM。如果只指定一个 FORM,则可以直接引用这些列。如果指定了多个 FORM,则必须使用表单名称或别名限定每个 DATAITEM。
SELECT <Qualifier>.<DataItem> FROM <Form_Name> SELECT Demographics.Subject_Date_of_Birth, Enrollment.Randomization_Number FROM Demographics, Enrollment
此示例查询会返回人口统计信息表单中出生日期条目和入组表单中随机化编号条目的所有值。
数据函数
还可以指定可以作为结果集特定列返回的函数。函数可以使用 DATAITEMS
作为参数,以及上述许多上下文。
可以使用函数访问 DATAITEM
的所有属性,但名称和 ID 除外。
不能在函数中使用条目组。
有关函数、接受的参数和定义的完整列表,请参阅下文。
SELECT STATUS(Demographics.Subject_Date_of_Birth) FROM Demographics
此示例查询会返回 Cholecap 2019 1 期研究中人口统计信息表单上的出生日期条目的状态。
Distinct
可以使用 DISTINCT 仅返回给定列或一组列中值的唯一实例。
SELECT DISTINCT <Qualifier>.<DataItem> FROM <Form_Name> SELECT DISTINCT Dosing.Dosage_Amount FROM Dosing
此示例查询会返回 Cholecap 2019 1 期研究中给药表单上剂量数量条目的所有唯一值。
在当前版本中,CDB 不会对使用 DISTINCT
的 CQL 语句列表显示单元格高亮。
别名(AS)
可以使用 AS
为查询中的表单和数据条目定义别名。当表单或数据条目的名称较长且想要多次引用时,别名非常有用。
可以为投影中的特定列提供别名。如果为数据条目提供别名,Workbench 会在列表中用该别名重命名该条目的列。如果数据条目的名称较长,数据条目的别名特别有用,如下例所示。在核心列表中查看结果时,使用较短的数据条目别名有助于限制水平滚动的需要。
还可以为表单提供别名。如果想在一个查询中多次引用表单,这将非常有用。设置别名后,只需使用别名,而不必使用表单名称来引用该表单。
SELECT <Qualifier>.<DataItem> AS <Item_Alias> FROM <Form_Name> as <Form_Alias> SELECT Demographics.Subject_Date_of_Birth as DOB, Enrollment.Randomization_Number_from_IRT as ID FROM Demographics, Enrollment
此示例查询会返回人口统计信息表单中出生日期条目和入组表单中随机化编号条目的所有值。
操作投影元素
除了 DATAITEMS
之外,还可以查询可能对查询结果有用的操作数据。其中最强大的操作元素是标题。标题是与请求的表单和数据条目相关的最重要研究元数据的摘要。还可以请求有关研究、研究中心、受试者、事件组和事件的信息。
可以在任何投影中使用 @HDR
变量符号返回标题信息。可以使用通配符查询 @HDR
信息,以检索所有可查询的元数据,或查询与表单相关的特定标题信息。
SELECT @HDR, <Qualifier>.<DataItem> FROM <Form_Name> SELECT @HDR.SITE, * FROM Dosing
上述查询会返回研究中心的摘要信息。
标题摘要
可以使用一组预定义的元素和列顺序在给定的上下文中创建特定的摘要。以下标题上下文可用:
@HDR.Study
@HDR.Site
@HDR.Subject
@HDR.Event
在当前版本中,@HDR.EventGroup
不包括摘要。必须指定一个属性才能使用事件组上下文。
如果单独使用 @HDR
变量和上下文,例如 @HDR.Study
,CQL 仅会返回一组有限的可用属性。
标题上下文 | 返回的属性 |
---|---|
@HDR.Study |
Study.Name |
@HDR.Site |
Site.Name, Site.PI |
@HDR.Subject |
Subject.Name, Subject.Status |
@HDR.Event |
Event.Name, Event.Date, Event.Status |
标题详细信息属性
还可以针对标题的特定元素进行操作,以便在选择中返回或在筛选子句中使用。使用点符号将属性名称附加到 @HDR
上下文,以检索该属性。例如,使用 @HDR.Study.Phase
返回研究的阶段,或使用 @HDR.Event.Date
返回事件的事件日期。
以下是每个 @HDR
上下文元素可用的属性,使用点符号。
标题上下文 | 可用属性 |
---|---|
@HDR.Study |
|
@HDR.Site |
|
@HDR.Subject |
|
@HDR.EventGroup |
|
@HDR.Event |
|
表单和条目组属性&
可以在选择或筛选子句中针对表单和条目组的属性进行操作。使用点符号将属性名称附加到 @Form
或 @ItemGroup
上下文,以检索该属性。例如,使用 @Form.CreatedDate
返回表单的创建日期。
上下文 | 可用属性 |
---|---|
@Form |
|
@ItemGroup |
|
表单链接条目
可以使用 @FormLink
表示法针对在条目到表单链接中使用的条目进行操作。包含表单链接条目的表单是链接表单。表单链接条目链接到链接表单。要使用 @FormLink
表示法,必须提供链接表单上表单链接条目的名称,以及希望在链接表单上针对的条目。
@FormLink.<FormLink-Name>.<Item-Name>
如果链接表单中的条目在多个条目组中使用,还必须提供条目组的名称。
@FormLink.<FormLink-Name>.<ItemGroup-Name>.<Item-Name>
如果链接表单在多个条目组中使用相同的表单链接条目,则必须指定条目组表单链接的名称。
@FormLink.<ItemGroup-Name-FormLink>.<FormLink-Name>.<ItemGroup-Name>.<Item-Name>
以下示例假设 AE 表单上有 2 个表单链接:ae_to_cm 和 ae_to_mh。可以使用以下 CQL 访问链接表单中的条目:
select @HDR.Subject.Name, AETERM, AESTDAT, AEONGO,@FormLink.ae_to_cm.CMTRT, @FormLink.ae_to_cm.CMSTDAT, @FormLink.ae_to_cm.CMONGO, @FormLink.ae_to_cm.CMENDAT,@FormLink.ae_to_mh.MHTERM, @FormLink.ae_to_mh.MHSTDAT, @FormLink.ae_to_mh.MHONGO, @FormLink.ae_to_mh.MHENDAT from `EDC`.`AE` where @For.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v')
FormLink ae_to_cm 位于 ae_to_cm 条目和 CM 表单之间。可以使用 @FormLink.ae_to_cm.CMONGO
访问链接表单 CM 中的 CMONGO 条目。
FormLink ae_to_mh 位于 ae_to_mh 条目和 MH 表单之间。可以使用 @FormLink.ae_to_mh.MHSTDAT
访问链接表单 MH 中的 MHSTDAT 条目。
可以在 WHERE
子句、Order By
子句和 Group By
子句中使用通过 @FormLink
表示法表示的条目。
以下 CQL 功能支持表单链接条目:
- UNION 和 UNION ALL
- On Subject ALIGN 和 UNALIGN
- 子查询
- UNPIVOT
查询属性
可以在选择或筛选子句中针对查询的属性进行操作。使用点符号将属性名称附加到 @QRY
或 @QRYMSG
,以检索该属性。例如,使用 @QRY.ID
检索查询的 ID。
@QRY
使用 @QRY
可查询查询对象的以下属性:
属性 | 描述 |
---|---|
ID | 为查询自动生成的 |
名称 | EDC 中定义的查询名称(VV #####)。请注意,对于第三方数据,此数字仍是唯一标识符。 |
状态 | 查询的当前状态(未处理、已回答或已关闭) |
类别 | 查询的来源(手动或系统生成) |
第一条消息 | 在查询中创建的第一条查询消息(打开查询时输入的备注)。这不是查询的所有查询消息(备注)的列表。 |
最新消息 | 在查询中创建的最新(最近)查询消息(响应查询时输入的备注)。这不是查询的所有查询消息(备注)的列表。 |
创建日期 | 创建(打开)查询的日期和时间。 |
创建者 | 创建(打开)查询的用户的用户名。 |
上次修改日期 | 上次修改查询的日期和时间。 |
上次修改者 | 上次修改查询的用户的用户名。 |
条目名称 | 查询被打开的条目的名称。如果查询是在事件日期进行的,则返回 |
事件名称 | 与查询相关联的事件的名称。 |
事件日期 | 与查询相关联的事件的事件日期。 |
受试者姓名 | 与查询相关联的受试者的姓名。 |
受试者状态 | 与查询相关联的受试者的受试者状态。 |
研究中心 | 分配给与查询相关联的受试者的研究中心。 |
研究中心所在国家/地区 | 分配给与查询相关联的受试者的研究中心所在研究国家/地区。 |
表单 | 与查询相关联的表单的名称。如果查询是在事件日期进行的,则返回 |
表单序列号 | 与查询相关联的表单的序列号。如果查询是在事件日期进行的,则返回 |
表单源 | 查询数据点的来源,例如,“实验室”、“EDC”或“eCOA”。 |
条目组序列号 | 与查询相关联的条目组的序列号。如果查询是在事件日期进行的,则返回 |
源系统 | 查询来源的源系统(EDC、CDB 等)的名称。在当前版本中,CQL 对于通过 CDB 中的检查打开的查询仅返回此属性的值“CDB”。 |
源名称 | 查询被打开的列表的名称。如果查询没有在 CDB 中打开,则返回 |
源 ID | 查询被打开的列表的 ID。如果查询没有在 CDB 中打开,则返回 |
开放回应 | 查询的创建日期与查询的首次回应日期之间的日期差。 |
规则 ID | 生成该查询的规则 ID(仅针对系统生成的查询)。 |
触发器 ID | 生成该查询的自定义触发器 ID。 |
导致数据更改 | 查询创建后数据是否更改。 |
行外部 ID | 数据导入期间分配给行的行外部 ID。 |
@QRYMSG
使用 @QRYMSG
可查询查询消息对象的以下属性:
属性 | 描述 |
---|---|
状态 | 查询消息的状态(未处理、已回答或已关闭)。 |
文本 | 消息的文本。 |
创建日期 | 创建查询消息的日期和时间。 |
创建者 | 创建查询消息的用户的用户名。 |
选择
选择(FROM
)是一种机制,通过该机制可以指定投影所操作的表单的名称。在使用通配符星号时,选择还指定投影的表单顺序。
在 CQL 中,FROM
始终指代从中选择数据的表单上下文。不能在 FROM
子句中使用任何其他上下文。
由于可通过 @HDR
变量访问标题,因此,如果不需要 FORM 和 DATAITEMS,也可以单独选择标题的任何元素。可以使用这些类型的选择来创建仅按受试者列出操作数据的结果。在投影仅包含 @HDR
时,可以在不提供 FROM 的情况下筛选此选择。但是,要使用别名和子查询,必须包含 FROM
子句。
On Subject 连接
默认情况下,CQL 对受试者和事件进行连接。因此,如果从不同事件的两个表单中进行选择,CQL 将为每个表单返回一行,而不是为每名受试者返回一行。在这种情况下,可以通过仅 On Subject 连接,为每名受试者返回一行,其中包含两个表单的数据。
要进行 On Subject 连接,将 on subject
附加到选择中的表单标识符的列表。可以使用任意数量的标识符,但 on subject
适用于所有指定的表单。
在与 on subject
一起使用时,CQL 会为任何 @HDR.EventGroup
或 @HDR.Event
属性返回 null,因为 on subject
可以返回来自多个事件组或事件的数据)。如果需要检索这些属性,可以通过选择每个表单的表单别名来检索。
已知问题:在当前版本中,CQL 不支持在 On Subject 连接时使用 COMPACT
。
以下示例查询会为每名受试者返回一行,其中包含 @HDR.Subject 属性、受试者姓名首字母、受试者出生日期、身高、体重、脉搏、收缩压、舒张压和体温。如果示例查询未使用按受试者连接,CQL 会为人口统计信息表单中的条目返回一行,为生命体征表单中的条目返回第二行。
SELECT @HDR.Subject, creation_criteria.subject_initials, creation_criteria.subject_dob, vitals.height, vitals.weight, vitals.pulse__bpm_, vitals.systolic_bp__hhMg, vitals.diastolic_bp__hhMg, vitals.temperature FROM demographics, vitals ON subject
对齐和未对齐修饰符&
在对重复的表单或条目组使用 on subject
时,可以选择返回对齐序列的数据(对齐)或即使序列未对齐时也返回数据(未对齐)。例如,在显示来自人口统计信息表单和重复不良事件表单的信息时,CQL 会在为受试者返回的所有不良事件表单实例的行中返回人口统计信息表单中的数据。这种行为被称为“未对齐”,因为即使序列未对齐,它也会返回数据。UNALIGN
是默认行为,因此在 CQL 语句中显式包含此修饰符是可选的。在此示例中,“对齐”行为将仅返回人口统计信息表单中为受试者的所有不良事件表单实例返回的第一行数据。要使用对齐行为,请包括 ALIGN
修饰符。
高级连接
CQL 还支持高级(定向)连接。使用高级连接,无需先连接到 @HDR 即可连接表单。
LEFT JOIN:
从第一个(左侧)表中获取所的有记录,以及来自第二个(右侧)表中任何匹配的数据。RIGHT JOIN:
从第二个(右侧)表中获取的所有记录,以及来自第一个(左侧)表中任何匹配的数据。INNER JOIN:
仅两个表中找到匹配的记录
在当前版本中,CQL 不支持外连接。
无法使用高级连接将参考数据与其他数据连接。
示例:表单之间的左联接
在以下 CQL 语句中,根据表单定义属性 @Form.Subject
,AE 和 CM 表单之间存在一个
LEFT JOIN。请注意,受试者.姓名是表单定义的一部分,而不是来自@HDR。
select @Form.Subject.Name, @Form.Event.Name, AETERM, AESTDAT, CMTRT, CMSTDAT from AE as ae LEFT JOIN CM as cm ON ae.@Form.Subject.Name = cm.@Form.Subject.Name where @Form.Status = 'submitted__v'
不需要连接到 @HDR 即可有效,因为连接条件是基于 @Form 属性(@Form.Subject.Name
),并且投影中不包含任何 @HDR 属性。
示例:表单和 @HDR 之间的左联接&
以下 CQL 查询需要与 @HDR 连接,因为投影具有 @HDR 属性。以下查询基于 Event.ID 在 @HDR 和 AE 之间建立了一个左连接 - 然后,这个左连接的输出再基于 Event.ID 和 Subject.ID 与 CM 进行左连接。
在以下 CQL 语句中,投影包含了 @HDR 属性,因此需要与 @HDR 进行连接。这是一个基于 @Form.Event.ID
的 @HDR 和 AE 表单之间的 LEFT JOIN
。该连接的输出随后又基于 @Form.Event.ID
和 @Form.Subject.ID
,与 CM 表单建立了一个 LEFT JOIN
。
select @HDR.Subject.Name, @HDR.Site.Name, AETERM, AESTDAT, CMTRT, CMTERM from @HDR LEFT JOIN AE as ae ON @HDR.Event.ID = ae.@Form.Event.ID LEFT JOIN CM as cm ON @HDR.Event.ID = cm.@Form.Event.ID and ae.@Form.Subject.ID = cm.@Form.Subject.ID
子查询
CQL 支持子查询。
使用 IN 的子查询
可以定义一个子查询,该子查询返回一个值列表,可以在筛选器的 IN
运算符中引用这些值。
SELECT * FROM Randomization WHERE @HDR.Subject.ID IN ( SELECT @HDR.Subject.ID FROM Demographics WHERE Creation_Criteria.Sex = 'Female' )
此查询返回所有女性受试者的随机化表单中的所有 DATAITEMS。
子查询连接
还可以定义两个 SELECT
语句,使用子查询(而不是典型的 JOIN
语法)将其连接在一起。使用逗号(,
)表示联接,将第二个子查询左外连接到第一个子查询。子选择可以使用别名,但这不是必需的。这些连接隐式包含 EventId 和 SubjectId。可以在子查询后使用筛选(WHERE
)子句进行额外的筛选。
SELECT * FROM ( SELECT @HDR.Subject, Creation_Criteria.Subject_Initials, Creation_Criteria.Age_at_Screening as Screening_Age FROM Demographics WHERE Creation_Criteria.Sex = 'Female' ) AS Female_Subjects, ( SELECT @HDR.Subject, Creation_Criteria.Subject_Initials, Creation_Criteria.Age_at_Screening as Screening_Age FROM Demographics WHERE Creation_Crtieria.Sex = 'Male' ) AS Male_Subjects WHERE Female_Subjects.Screening_Age = Male_Subjects.Screening_Age
函数中的子查询
可以在函数中使用子查询,包括 @HDR
、@Form
标题和 DATAITEMS。
SELECT @HDR.Subject, Body_Temperature, IF (IFNULL(Body_Temperatore,0) < (SELECT AVG(Body_Temperature) FROM Vitals), 'Below Avg', 'Acceptable') AS CompTemp FROM Vitals
相关子查询
CQL 允许使用相关子查询来筛选结果。
SELECT * FROM Demographics WHERE Age_at_Screening > ( SELECT AVG(Age_at_Screening) FROM Demographics )
筛选
可以使用筛选器来减少通过投影和选择提供的初始 CQL 结果的值。这是可选的。CQL 中的主要过滤机制是 WHERE
子句。
WHERE Status(Form) = 'Complete' AND GENDER = 'Male'
提示:核心列表返回所有状态为已提交的表单。可以编辑 WHERE
子句以返回状态为已提交和进行中提交后的表单。使用以下 CQL:WHERE @Form.Status in ('submitted__v', 'in_progress_post_submit__v')
。
比较函数和运算符&
以下函数和运算符可在 WHERE
子句中使用:
运算符 | 定义 |
---|---|
AND |
逻辑和 |
OR |
逻辑或 |
= |
等于 |
!= |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
IS |
测试一个值是否符合布尔条件 |
IS NOT |
测试一个值是否符合布尔条件 |
IS NULL |
测试一个值是否为空 |
IS NOT NULL |
测试一个值是否为空 |
IN() |
检查一个值是否在定义的值集合中 |
NOT IN() |
检查一个值是否不在定义的值集合中 |
BETWEEN...AND... |
检查一个值是否在值范围内 |
CONTAINS |
检查一个值是否包含在另一个值中 |
DOES NOT CONTAIN |
检查一个值是否不包含在另一个值中 |
顺序
可以使用 ORDER BY
子句自定义结果的顺序。
例如:
SELECT @HDR * ORDER BY @HDR.Subject.Name ASC, ETHNICITY
已知问题:在当前版本中,Workbench 不支持对重复条目组中的任何数据条目使用 ORDER BY
。
备注
如果需要,还可以在 CQL 语句中包含备注。要包含备注,请输入两个短划线和一个空格(--
),后跟备注。
SELECT @HDR, * from EDC.adverse_events WHERE @Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v') -- comment text
数据汇总
CQL 可以对查询结果执行基本的数据汇总。可以在聚合函数中引用标题的任何元素或任何 DATAITEM。聚合函数接受通配符、@ 变量和特定 DATAITEMS 作为参数。
聚合函数
运算符 | 定义 |
---|---|
AVG() |
返回参数的平均值 |
COUNT() |
返回所返回行数的计数 |
MAX() |
返回最大(最高)值 |
MIN() |
返回最小(最低)值 |
SUM() |
返回总和 |
STDDEV_POP() |
总体标准差 |
STDDEV_SAMP() |
样本标准差 |
VAR_POP() |
返回总体标准方差 |
VAR_SAMP() |
返回样本方差 |
如果未指定要计数的属性,CQL 会将请求视为该对象中所有列的计数。这相当于在该特定表上执行 COUNT(*)
。
由于聚合函数不支持与 WHERE
一起使用,因此可以使用 HAVING
关键字来替代。要使用 HAVING
,CQL 投影必须至少包含一个聚合函数。
SELECT COUNT(@HDR.Subject.Name), @HDR.Site.Number FROM EDC.demographics GROUP BY @HDR.Site.Number HAVING COUNT(@HDR.Subject.Name) > 100
对结果进行分组
CQL 支持 GROUP BY
语法,只要在投影中包含至少一个聚合函数即可。
SELECT COUNT(@HDR.Event), @HDR.Subject GROUP BY @HDR.Subject SELECT @HDR, AVG(SYSTOLIC) FROM Vitals GROUP BY @HDR.Subject
结果结构
CQL 结果根据在投影中提供的元素按特定顺序返回。CQL 包括三种快速识别应包含在投影中的内容的方法:标题、通配符和限定通配符。可以在查询中指定应返回的其他列。
根据投影中包含的 DATAITEMS,执行数据的排序顺序也会有所不同。
表单和数据条目结果&
与 SELECT @HDR
表示法一样,其余的 FORM 和 DATAITEMS 可以使用 SELECT *
或SELECT ItemGroup.*
返回。使用这些表示法时,结果集有一个默认的列顺序,并且此部分中的行在遵循应用于标题(如果包含在投影中)的排序顺序之后,将按特定排序顺序返回。
如果在查询中不使用通配符表示法,则必须在投影中指定希望返回的数据列。结果的顺序将符合以下列出的排序选项的层级结构,具体取决于投影中包含的元素。
请注意,任何包含在排序层级结构中的对象都将存在,即使该特定列不存在,排序层级规则仍然适用。
SELECT * 默认列顺序
列的布局是从下面列出的 FORM 属性开始,然后按照表单的布局顺序进行布局。
- 表单名称
- 表单序列号(仅在表单重复时)
- 项组
- 序列号(仅在条目组重复时)
- 条目 1
- 条目 2
- 条目 N
SELECT ItemGroup.* 默认列顺序
列的布局是从下面列出的 FORM 和条目组属性开始,然后按照条目组的布局顺序进行布局。
- 表单名称
- 表单序列号(仅在表单重复时)
- 项组
- 序列号(仅在条目组重复时)
- 条目 1
- 条目 2
- 条目 N
列标题
CQL 使用特定模式为每列命名:
@HDR
列:Object.Property,例如,对于@HDR.Site.Name
,列名为“Site.Name”- 数据条目:条目定义的名称
- 别名:对于任何具有别名的数据,CQL 将使用别名作为列标题。
由于表单和条目组可以重复,它们遵循与标题结果相同的 Object.Property
表示法,例如:Form.Name
、ItemGroup.SeqNbr
等。
宽格式和紧凑格式&
CQL 始终在结果集中返回带有 @Form
和 @ItemGroup
信息的数据条目,这被称为表单标题。这些信息对于理解给定数据条目是在哪个表单和条目组中收集的非常有用。除了表单标题之外,还可以选择以宽格式或紧凑格式排列数据条目。默认情况下,CQL 以宽格式返回结果。
宽格式是指在查询的上下文中,每个数据条目都以独立的列形式返回,适用于每一个收集的表单或条目组。
紧凑格式是指数据条目的结果以单一列的形式呈现,而不论其来源于哪个表单或条目组。这种格式在比较条目值时非常实用。
要以紧凑格式返回结果,请在 SELECT
语句中指定 COMPACT
:
SELECT COMPACT @HDR, Creation_Criteria.* FROM Demographics
该查询以紧凑格式返回人口统计信息表单中的创建标准条目组的 @HDR
摘要和 DATAITEMS
。
示例:多个表单重用同一个条目
在此示例中,一项研究有两个表单,即人口统计信息和知情同意,两个表单都使用出生日期条目。
宽格式
Form.Name | Form.SeqNbr | ItemGroup.Name | ItemGroup.SeqNbr | Initials | Age_at_Screening | DOB | DOB |
---|---|---|---|---|---|---|---|
人口统计信息 | 1 | Creation_Criteria | 1 | CMA | 27 | 02-22-1992 | -- |
Informed_Consent | 1 | Informed_Consent | 1 | -- | -- | -- | 02-22-1992 |
紧凑格式
Form.Name | Form.SeqNbr | ItemGroup.Name | ItemGroup.SeqNbr | Initials | Age_at_Screening | DOB |
---|---|---|---|---|---|---|
人口统计信息 | 1 | Creation_Criteria | 1 | CMA | 27 | 02-22-1992 |
Informed_Consent | 1 | Informed_Consent | 1 | -- | -- | 02-22-1992 |
示例:重复表单
在此示例中,一项研究有重复的不良事件表单。
宽格式
Form.Name | Form.SeqNbr | ItemGroup.Name | ItemGroup.SeqNbr | Start_Date | End_Date | Start_Date | End_Date |
---|---|---|---|---|---|---|---|
Adverse_Event | 1 | AE_Duration | 1 | 05-18-2019 | 05-23-2019 | -- | -- |
Adverse_Event | 2 | AE_Duration | 1 | -- | -- | 11-27-2019 | 11-29-2019 |
紧凑格式
Form.Name | Form.SeqNbr | ItemGroup.Name | ItemGroup.SeqNbr | Start_Date | End_Date |
---|---|---|---|---|---|
Adverse_Event | 1 | AE_Duration | 1 | 05-18-2019 | 05-23-2019 |
Adverse_Event | 2 | AE_Duration | 1 | 11-27-2019 | 11-29-2019 |
示例:重复条目组
在此示例中,一项研究有一个体格检查表单,其中有一个按身体部位进行检查的重复的条目组。
宽格式
Form.Name | Form.SeqNbr | ItemGroup.Name | ItemGroup.SeqNbr | body_area | date_of_exam | body_area | date_of_exam |
---|---|---|---|---|---|---|---|
physical_exam | 1 | exam_by_body_area | 1 | Head(头部) | 12-11-2019 | --- | --- |
physical_exam | 1 | exam_by_body_area | 2 | --- | --- | Chest(胸部) | 12-11-2019 |
紧凑格式
Form.Name | Form.SeqNbr | ItemGroup.Name | ItemGroup.SeqNbr | body_area | date_of_exam |
---|---|---|---|---|---|
physical_exam | 1 | exam_by_body_area | 1 | Head(头部) | 12-11-2019 |
physical_exam | 1 | exam_by_body_area | 2 | Chest(胸部) | 12-11-2019 |
日志表单事件
EDC 中的某些事件没有与之关联的事件日期。这些事件被称为“日志”事件,而这些事件中的 FORM 则称为“日志表单”。常见的日志表单示例包括不良事件和合并用药表单。这些日志表单中的信息独立于计划事件进行收集。
当日志表单包含在投影中时,CQL 会将这些表单分组到一个日志事件下。日志事件始终列在结果集中的所有其他事件组之后。
函数
CQL 支持多种函数,以提供有关给定 DATAITEM 或 FORM 的额外信息。可以在 CQL 投影、筛选器和 Order By 子句中包含任一函数。CQL 还包括一组专门用于查询临床数据的函数。
临床
以下临床函数可用:
DESCRIPTION
返回指定数据条目的条目定义中提供的描述。
语法
DESCRIPTION(DATAITEM)
示例
SELECT DESCRIPTION(Randomization.Randomization_Number) FROM Enrollment
此查询返回入组表单中随机化编号条目的描述值。
DMR
如果 DATAITEM 已经过数据管理审查(DMR),则返回真(true),否则返回假(false)。
语法
DMR(DATAITEM)
示例
SELECT @HDR.Subject.Name, @HDR.Site.Name, @HDR.Event.Name, @HDR.Event.Date, AESTDAT, DMR(AESTDAT) as `Is AE Start Date DMR` FROM AE where @Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v')
FROZEN
根据给定数据条目当前是否被冻结返回真或假。如果该值为 NULL,则从其父项(条目组和表单)继承。
语法
FROZEN(DATAITEM)
示例
SELECT FROZEN(Creation_Criteria.Initials) FROM Demographics
如果人口统计信息表单上的姓名首字母条目被冻结,则此查询返回 true
。如果姓名首字母条目已解锁,则此查询返回 false
。
HELPTEXT
返回指定数据条目的条目定义中提供的帮助文本。
语法
HELPTEXT(DATAITEM)
示例
SELECT HELPTEXT(Randomization.Randomization_Number) FROM Enrollment
此查询返回入组表单中随机化编号条目的帮助文本(在 Vault EDC 中创建的条目的帮助内容属性)值。
HINTLABEL
返回指定数据条目的条目定义中提供的提示标签。
语法
SELECT HINTLABEL(Randomization.Randomization_Number) FROM Enrollment
此查询返回入组表单中随机化编号条目的提示标签(在 Vault EDC 中创建的条目的提示标签属性)值。
ILB
根据给定 DATAITEM 是否标记为故意留空返回真或假。如果该值为 NULL,则从其父表单继承。
语法
ILB(DATAITEM)
示例
SELECT @HDR, * FROM Dosing WHERE ILB(Dosage_Amount) = FALSE
对于任何剂量条目没有标记为故意留空的受试者,此查询从给药表单中返回标题摘要(@HDR)和所有数据条目(*)。
ILBREASON
返回与标记为故意留空的 DATAITEM 或 FORM 相关联的更改原因。
语法
ILBREASON(DATAITEM)
示例
SELECT ILBREASON(Dosage_Amount) FROM Dosing WHERE ILB(Dosage_Amount) = TRUE
此查询返回给药表单上标记为故意留空的剂量条目的更改原因。此查询筛选结果,以便 CQL 不返回没有被标记为故意留空的剂量条目的行。
LABEL
返回指定 DATAITEM 的条目定义中提供的标签。可以选择指定一个替代的区域设置,以返回本地化标签。默认情况下,LABEL() 返回当前用户区域设置中的标签。在此处查看 Vault CMDS 区域设置值的列表。
语法
LABEL(DATAITEM,['locale'])
示例
SELECT LABEL(Randomization.Randomization_Number, 'es_PR') FROM Enrollment
此查询返回入组表单中随机化编号条目的本地化(适用于 es_PR,或 Puerto Rico)条目标签。
CODELABEL
返回为代码列表类数据条目选择的代码列表条目提供的标签。
语法
CODELABEL(DATAITEM)
示例
SELECT CODELABEL(adverse_event.AEACTN) FROM Adverse_Event
此查询返回为 AEACTN(对研究药物采取的措施)代码列表条目选择的代码列表条目的标签。
LASTMODIFIEDDATE
返回上次修改 DATAITEM 的日期(对于 Vault EDC 中的数据,这基于条目对象上的最后修改日期字段)。
语法
LASTMODIFIEDDATE(DATAITEM)
示例
SELECT LASTMODIFIEDDATE(Randomization.Randomization_Number) FROM Enrollment
返回入组表单中随机化编号条目的上次修改日期。
LOCKED
根据给定 DATAITEM 当前是否已锁定返回真或假。如果该值为 NULL,则从其父项(条目组和表单)继承。
语法
LOCKED(DATAITEM)
示例
SELECT LOCKED(Creation_Criteria.Initials) FROM Demographics
如果人口统计信息表单上的姓名首字母条目已锁定,则此查询返回 true
。如果姓名首字母条目已解锁,则此查询返回 false
。
SDV
如果 DATAITEM 已经过源数据验证(SDV),则返回真,否则返回假。
语法
SDV(DATAITEM)
示例
SELECT @HDR.Subject.Name, @HDR.Site.Name, @HDR.Event.Name, @HDR.Event.Date, AETERM, SDV(AETERM) as `Is AE Term SDV` FROM AE where @Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v')
SIGNED
根据给定 DATAITEM 当前是否已签名返回真或假。如果该值为 NULL,则从其父项(条目组和表单)继承。
语法
SIGNED(DATAITEM)
示例
SELECT SIGNED(Creation_Criteria.Initials) FROM Demographics
如果人口统计信息表单上的姓名首字母条目已签名,则此查询返回 true
。如果姓名首字母条目尚未签名,则此查询返回 false
。
STATUS
返回 DATAITEM 的状态。还可以使用此函数通过使用点表示法和 @Form 变量来返回表单的状态,而不是使用 STATUS()
。请参阅第二个示例。
语法
STATUS(DATAITEM)
示例
SELECT STATUS(Randomization.Randomization_Number) FROM Enrollment
此查询返回入组表单中随机化编号条目的状态值。
SELECT @Form.Status FROM Enrollment
此查询返回入组表单的状态。
UOM
返回 DATAITEM 的计量单位(UOM)
语法
UOM(DATAITEM)
示例
SELECT UOM(Vitals.Weight) FROM Vitals
此查询返回生命体征表单中体重条目的 UOM。
UOMTRANSLATED
返回默认单位的度量单位(UOM),而不是用户输入的单位(例如,华氏度而不是摄氏度)
语法
UOMTRANSLATED(Vitals.Temperature)
示例
SELECT TRANSLATED(Vitals.Temperature) FROM Vitals
此查询返回“华氏度”,这是体温条目的默认单位。
TRANSLATED
返回默认单位的值,该值从用户输入的单位转换为默认单位
语法
TRANSLATED(DATAITEM)
示例
SELECT TRANSLATED(Vitals.Temperature) FROM Vitals
此查询从生命体征表单中的体温条目返回以华氏度(默认单位)为单位的值,即使研究中心用户输入的温度以摄氏度为单位。
FILL
对于返回 CQL NULL
的单元格,从非重复条目组中的条目返回指定的填充值。此函数仅可在投影中使用。
语法
FILL(DATAITEM)
示例
select @HDR.Subject.Name, @HDR.Site.Name, @Form.SeqNbr, @ItemGroup.SeqNbr, CMTRT, fill(CMTRT) as fill_CMTRT, CMSTDAT, CMONGO from CM where (@Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v'))
在此示例中,CM
表单包含一个重复条目组和一个非重复条目组。CMTRT 条目位于非重复组中,因此它在重复条目组实例的行中返回 --
(表示 NULL
)。此示例返回 fill_CMTRT
列中该列 Null 单元格的 CMTRT
条目的值。
FormName, FormSeqNbr, ItemGroupName, ItemGroupSeqNbr
返回数据条目的表单和条目组的名称和序列号。
语法
FormName(Item), FormSeqNbr(Item), ItemGroupName(Item), ItemGroupSeqNbr(Item)
示例
SELECT FormName(ae_term), FormSeqNbr(ae_term), ItemGroupName(ae_term), ItemGroupSeqNbr(ae_term) FROM adverse_event
实验室
以下函数可与 EDC 的实验室模块中的数据一起使用。
SPECIMENTYPE
返回 LBTEST 列中指定分析物的标本类型。将 LBTEST 条目与此函数一起使用。
语法
SpecimenType(LBTEST)
示例
SELECT LBTEST, SpecimenType(LBTEST) FROM edc.baseline_labs
上述示例返回 LBTEST 条目和该检测的标本类型。
TESTINGMETHOD
返回 LBTEST 列中指定分析物的检测方法。将 LBTEST 条目与此函数一起使用。
语法
TestingMethod(LBTEST)
示例
SELECT LBTEST, TestingMethod(LBTEST) FROM edc.baseline_labs
上述示例返回 LBTEST 条目和该检测的检测方法。
LOINCCODE
返回 LBTEST 列中指定分析物的 LOINC 编码。将 LBTEST 条目与此函数一起使用。
语法
LOINCCode(LBTEST)
示例
SELECT LBTEST, LOINCCode(LBTEST) FROM edc.baseline_labs
上述示例返回 LBTEST 条目和该检测的 LOINC 编码。
ANALYTECODE
返回 LBTEST 列中指定分析物的分析物代码。将 LBTEST 条目与此函数一起使用。
语法
AnalyteCode(LBTEST)
示例
SELECT LBTEST, AnalyteCode(LBTEST) FROM edc.baseline_labs
上述示例返回 LBTEST 条目和该检测的分析物代码。
LABLOCTITLE
返回实验室位置的实验室标题。LBLOC 仅返回实验室 ID。将 LBLOC 条目与此函数一起使用。
语法
LabLocTitle(LBLOC)
示例
SELECT LBLOC, LabLocTitle(LBLOC) FROM edc.baseline_labs
上述示例返回在基线实验室表单中选择的实验室 ID(LBLOC)和实验室位置的实验室位置标题。
OVERRIDEREASON
返回研究中心用户在输入正常覆盖时提供的覆盖原因。将 LBOVRDNRLO 和 LBOVRDNRHI 条目与此函数一起使用。
语法
OverrideReason(LBOVRDNRLO), OverrideReason(LBOVRDNHRI)
示例
SELECT OverrideReason (LBOVRDNRLO), OverrideReason(LBOVRDNRHI) FROM edc.baseline_labs
编码
以下函数允许检索有关已分配的已编码术语和编码表单状态的信息。Vault Coder 支持使用 MedDRA 和 WHODrug(B3 和 C3)词典进行编码。
如果在未配置使用 Vault Coder 的表单上使用这些函数,CQL 将返回错误。
CODEDTERM
如果存在已编码术语(表单的编码请求处于已编码或已自动编码状态),则返回数据条目的已编码术语。CQL 默认返回 MedDRA 词典的首选语和 WHODrug 词典的首选名称。可以指定一个术语级别以返回另一个级别,例如 HLT 或 LLT。
语法
CODEDTERM(Item, 'TermLevel')
示例
SELECT CODEDTERM(ae_term.ae, 'Primary Path') as `Primary Path`, CODEDTERM(ae_term.ae, 'LLT') as LLT, CODEDTERM(ae_term.ae, 'PT') as PT, CODEDTERM(ae_term.ae, 'HLT') as HLT, CODEDTERM(ae_term.ae, 'HLGT') as HLGT, CODEDTERM(ae_term.ae, 'SOC') as SOC FROM adverse_event
术语级别
MedDRA | WHODrug |
---|---|
主路径 | 药物名称 |
LLT | 首选名称 |
PT | ATC4 |
HLT | ATC3 |
HLGT | ATC2 |
SOC | ATC1 |
CODEDCODE
如果存在编码代码(表单的编码请求处于已编码或已自动编码状态),则返回数据条目的编码代码。CQL 默认返回 MedDRA 词典的首选语编码和 WHODrug 词典的首选编码。可以指定一个编码等级以返回另一个等级。
语法
CODEDCODE(Item, 'CodeLevel')
示例
SELECT CODEDCODE(medication_therapy.conmed, 'DrugCD'), CODEDCODE(medication_therapy.conmed, 'PreferredCD'), CODEDCODE(medication_therapy.conmed, 'LLTCD'), CODEDCODE(medication_therapy.conmed, 'PTCD'), CODEDCODE(medication_therapy.conmed, 'HLTCD'), CODEDCODE(medication_therapy.conmed, 'HLGTCD'), CODEDCODE(medication_therapy.conmed, 'SOCCD') FROM concomitant_medication
编码等级
MedDRA | WHODrug |
---|---|
– | 药物 CD |
LLTCD | 首选 CD |
PTCD | ATC4CD |
HLTCD | ATC3CD |
HLGTCD | ATC2CD |
SOCCD | ATC1CD |
CODEDDICTREL
返回分配给表单的已编码词典版本。
语法
CODEDDICTREL(Item)
示例
SELECT CODEDDICTREL(ae_term.ae) FROM adverse_event SELECT CODEDDICTREL(medication_therapy.conmed) FROM concomitant_medication
CODEDSTATUS
返回条目(编码请求)的编码状态。
语法
CODEDSTATUS(item)
示例
SELECT CODEDSTATUS(ae_term.ae) FROM adverse_event
CODEDBY
返回条目的编码者(对编码请求进行编码的用户的用户 ID)。
语法
CODEDBY(item)
示例
SELECT CODEDBY(ae_term.ae) FROM adverse_event
LASTCODED
返回条目的上次编码日期(编码请求上次处于已编码或已自动编码状态的日期)。
语法
LASTCODED(item)
示例
SELECT LASTCODED(ae_term.ae) FROM adverse_event
参考对象
以下参考对象函数可用:
KEYMATCH
如果 related_item
和 related_key
之间相匹配,则返回 true
。
KEYMATCH
利用清单文件中的 related_item
和 related_key
对条目进行匹配。如果表单中的 related_item 与参考数据中的 related_key
相匹配,则 keymatch 列的值为 true
。否则,值为 false
。
在 KEYMATCH
函数的第一个参数中指定表单的源时(SourceName.FormName
),第一个参数中指定的 SourceName.FormName
必须完全匹配 FROM
子句中的 SourceName.FormName
。
语法
KEYMATCH(form_name, reference_object_name)
控制流
以下控制流函数可用:
IF
评估逻辑表达式,并在为真或为假时返回一个值。此函数在比较两个值时非常有用。
语法
IF(<Expression>, <Return_Value_True>,<Return_Value_False>)
示例
SELECT IF(Item1=Item2,1,0) as comp FROM Form1
如果条目 1 等于条目 2,则此查询返回“1”。如果条目 1 不等于条目 2,则此查询返回“0”。
CASE
评估逻辑表达式,并在为真或为假时返回一个值。此函数在比较多个值时非常有用。
语法
CASE WHEN(<Expression>) THEN '<Return_Value>' ELSE '<Return_Value>' END
示例
SELECT CASE WHEN(Item1=Item2) THEN 'a' WHEN Item1 > Item2 THEN 'b' ELSE 'c' END FROM Form1
当条目 1 等于条目 2 时,此查询返回“a”,当条目 1 大于条目 2 时,返回“b”,如果以上条件都不成立,则返回“c”。
IFNULL
评估 DATAITEM,并在 DATAITEM 为 NULL 时返回一个值。
语法
IFNULL(DATAITEM,<Return_Value>)`
示例
SELECT IF(IFNULL(Item1,0)=Item2,1,0) as comp FROM Form1
如果条目 1 与条目 2 相等,或者条目 1 为 NULL 且条目2 等于 0,则此查询返回”1“。否则,此查询返回”0“。
字符串
以下字符串函数可用:
CONCAT
返回连接参数后得到的字符串。
语法
CONCAT(DATAITEM, 'string')
示例
SELECT CONCAT(@HDR.Subject.ID,'_',Creation_Criteria.Initials) FROM Demographics
此查询返回受试者 ID、下划线和姓名首字母条目值的拼接字符串,例如 101-1001_CRJ。
CONCAT_WS
返回带有分隔符的参数
语法
CONCAT_WS ( separator, DATAITEM1, DATAITEM2)
示例
select @HDR.Subject.Name, @HDR.Event.Name, AETERM, concat_ws ( ' ', 'AE ID ', @Form.SeqNbr, ' .', @ItemGroup.SeqNbr ) from AE
GROUP_CONCAT
从组中返回非 NULL 值的拼接字符串。
语法
GROUP_CONCAT ( DATAITEM)
示例
select @HDR.Subject.Name, @HDR.Event.Name, @Form.SeqNbr, group_concat(@ItemGroup.SeqNbr) from `EDC`.`AE` where @Form.Status = 'submitted__v' or @HDR.Event.Status IN ('did_not_occur__v') group by @HDR.Subject.Name, @Form.SeqNbr
COALESCE
返回第一个非 NULL 参数
语法
COALESCE (DATAITEM1, DATAITEM2, ...)
示例
select @HDR.Subject.Name, MHTERM, MHSTDAT, MHONGO, coalesce(MHTRT_1, MHTRT_2) from MHTERM
LENGTH
返回参数传递的值或 DATAITEM 的长度。
语法
LENGTH(DATAITEM)
示例
SELECT LENGTH(Item1) FROM Form1
此查询返回表单 1 中条目 1 值的长度。
TRIM
删除 DATAITEM 的前导和尾部空格。
语法
TRIM(DATAITEM)
示例
SELECT TRIM(Baseline_X-ray.Interpretation) FROM Baseline_Exam
此查询返回基线检查表单中解释条目的值,删除了所有前导和尾部空格。
LTRIM
删除 DATAITEM 的前导空格。
语法
LTRIM(DATAITEM)
示例
SELECT LTRIM(Baseline_X-ray.Interpretation) FROM Baseline_Exam
此查询返回基线检查表单中解释条目的值,删除了所有前导空格。
RTRIM
删除 DATAITEM 的尾部空格。
语法
RTRIM(DATAITEM)
示例
SELECT RTRIM(Baseline_X-ray.Interpretation) FROM Baseline_Exam
此查询返回基线检查表单中解释条目的值,删除了所有尾部空格。
UPPER
将 DATAITEM 转换为大写。
语法
UPPER(DATAITEM)
示例
SELECT UPPER(Item1) FROM Form1
此查询以大写形式返回姓名首字母条目的值,例如,从“cfa”转换为“CFA”。
LOWER
将 DATAITEM 转换为小写。
语法
LOWER(DATAITEM)
示例
SELECT LOWER(Item1) FROM Form1
此查询以小写形式返回条目 1 的值。
LEFT
返回最左边 len(数量)个字符。
语法
LEFT(DATAITEM,len)
示例
SELECT LEFT(Creation_Criteria.Initials,1) FROM Demographics
此查询返回姓名首字母条目中最右边的一个字符(受试者姓名的最后一个首字母)。
RIGHT
返回最右边 len(数量)个字符。
语法
RIGHT(DATAITEM,len)
示例
SELECT RIGHT(@HDR.Subject.ID,4) FROM Demographics
此查询返回受试者 ID 中最右边的 4 个字符。在 Cholecap2019_Phase1 研究中,这是受试者的四位数标识符,例如 1001,附加到研究中心编号构成了受试者 ID(例如 104-1001)。
MID
返回从指定位置开始的子字符串
语法
MID ( DATAITEM, start index, length )
示例
select @HDR.Subject.Name, AETOXGR, MID(AETOXGR, 7, 1) as `Grade Number` from `EDC`.`AE`
REGEXP
判断字符串是否与正则表达式匹配
语法
REGEXP 'regular expression pattern'
示例
select @HDR.Subject.Name, SAE_TERM from `EDC`.`AE` where SAE_TERM regexp ',|\\[|\\]|{|}|\\(|\\)'
REPLACE
替换指定字符串
语法
REPLACE ( DATAITEM , 'substring' , 'new_string')
示例
select @HDR.Subject.Name, AETOXGR, replace(AETOXGR, 'GRADE', 'G') from `EDC`.`AE`
SUBSTR
返回指定的子字符串
语法
SUBSTR (DATAITEM, start index, length)
示例
select @HDR.Subject.Name, AETOXGR, SUBSTR(AETOXGR, 7, 1) as `Grade Number` from `EDC`.`AE`
日期和时间&
CDB 支持三种不同的方式来查看通过 EDC 捕获的日期和日期时间:推断、原始和研究中心标准化。推断日期是指应用逻辑来推断日期或日期时间中任何缺失部分(未知)的日期。在 EDC 中,研究可以收集日期和日期时间中未知的日、月或小时部分。在 CDB 中,如果日期包含未知部分,CDB 首先会对这些未知部分应用推断逻辑。如果月份未知,CDB 会将其推断为该年的第一个月。如果日期未知,CDB 会将其推断为当天的第一个小时。所有日期和日期时间默认以完整日期和日期时间形式返回,其中未知部分通过推断估计。这种处理方式便于查看和清理日期和日期时间的比较。
CDB 还可以返回使用 RawDate()
函数输入的日期和日期时间的确切表示。该函数始终以字符串形式返回输入的确切值,它不会替换任何未知部分。此外,CDB 还可以使用 SiteNormalizedDate()
函数将日期或日期时间作为研究中心标准化值返回。此函数返回经过调整的日期和日期时间,以匹配捕获这些数据的研究中心的时区。
以下函数可用于日期和时间:
ADDDATE
从给定日期或日期类型的 DATAITEM 中添加一个日期/时间间隔(得到一个更晚的日期)并返回该日期/时间。
可以提供一个天数,或者使用 INTERVAL
指定一个数值和单位。
语法
ADDDATE ('date', days)
或
ADDDATE('date', INTERVAL value unit)
CQL 支持以下间隔单位:
- 微秒(MICROSECOND)
- 秒(SECOND)
- 分钟(MINUTE)
- 小时(HOUR)
- 天(DAY)
- 周(WEEK)
- 月(MONTH)
- 季度(QUARTER)
- 年(YEAR)
- 秒_微秒(SECOND_MICROSECOND)
- 分钟_微秒(MINUTE_MICROSECOND)
- 分钟_秒(MINUTE_SECOND)
- 小时_微秒(HOUR_MICROSECOND)
- 小时_秒(HOUR_SECOND)
- 小时_分钟(HOUR_MINUTE)
- 天_微秒(DAY_MICROSECOND)
- 天_秒(DAY_SECOND)
- 天_分钟(DAY_MINUTE)
- 天_小时(DAY_HOUR)
- 年_月(YEAR_MONTH)
示例
SELECT ADDDATE(Randomization.Date_of_Randomization, INTERVAL 5 DAY) FROM Enrollment
此查询返回随机化日期值后 5 天的日期。
SUBDATE
从给定日期或日期类型的 DATAITEM 中减去一个日期/时间间隔(得到一个更早的日期)并返回该日期/时间。
可以提供一个天数,或者使用 INTERVAL
指定一个数值和单位。
语法
SUBDATE ('date', days)
或
SUBDATE('date', INTERVAL value unit)
CQL 支持以下间隔单位:
- 微秒(MICROSECOND)
- 秒(SECOND)
- 分钟(MINUTE)
- 小时(HOUR)
- 天(DAY)
- 周(WEEK)
- 月(MONTH)
- 季度(QUARTER)
- 年(YEAR)
- 秒_微秒(SECOND_MICROSECOND)
- 分钟_微秒(MINUTE_MICROSECOND)
- 分钟_秒(MINUTE_SECOND)
- 小时_微秒(HOUR_MICROSECOND)
- 小时_秒(HOUR_SECOND)
- 小时_分钟(HOUR_MINUTE)
- 天_微秒(DAY_MICROSECOND)
- 天_秒(DAY_SECOND)
- 天_分钟(DAY_MINUTE)
- 天_小时(DAY_HOUR)
- 年_月(YEAR_MONTH)
示例
SELECT SUBDATE(Randomization.Date_of_Randomization, INTERVAL 5 DAY) FROM Enrollment
此查询返回随机化日期值前 5 天的日期。
TIMESTAMPDIFF
从日期时间表达式中减去一个时间间隔。
语法
TIMESTAMPDIFF(month, date, date)
示例
select @HDR.Subject.Name, AESTDT, AEENDDT, timestampdiff(day, AESTDT, AEENDDT) from `EDC`.`AE`
DATEDIFF
返回两个日期之间的天数差。
语法
DATEDIFF('date', 'date')
示例
SELECT DATEDIFF(Randomization.Date_of_Randomization, '2019-12-31') FROM Enrollment
此查询返回随机化日期条目的日期值与 2019 年 12 月 12 日之间的差异(以天为单位)。
DATE_FORMAT
以指定格式返回给定日期。请参阅以下日期说明符列表。
语法
DATE_FORMAT(<date>,'<format>')
示例
SELECT DATE_FORMAT(@HDR.Event.Date, '%Y-%m-%d')
此查询以 %Y-%m-%d 格式返回事件日期(例如 2019-12)
SITENORMALIZEDDATE
CDB 默认返回在 EDC 中输入的日期时间值。SiteNormalizedDate 函数返回标准化为 UTC 时间的日期时间。
语法
SiteNormalizedDate(date)
示例
select @HDR.Site.Name, @HDR.Site.Number, @HDR.Site.Timezone, @HDR.Site.Country, @HDR.Site.CountryName, @HDR.Subject.Name, AESTDT, SiteNormalizedDate(AESTDT) as 'Site Normalized Start Date' from `EDC`.`AE` where @Form.Status = 'submitted__v'or @HDR.Event.Status in ('did_not_occur__v')
在此示例中,受试者在 3 个时区之间的 AE 开始日期相同。AESTDAT 将返回在 EDC 中输入的日期时间值,而 SiteNormalizedDate
函数将返回标准化为 UTC 时间的日期时间值。
RAWDATE
以原始格式返回给定的日期或日期时间。在原始格式中,会不经任何修改显示部分日期和时间。
如果在研究中心的本地时区中输入了日期,则 RawDate
将返回研究中心的本地时区。
请参阅以下原始格式的部分日期列表。
语法
RawDate(<date>)
示例
select @HDR.Site.Name, @HDR.Site.Number, @HDR.Site.Timezone, @HDR.Site.Country, @HDR.Site.CountryName, @HDR.Subject.Name, AESTDT, SiteNormalizedDate(AESTDT) as 'Site Normalized Start Date', RawDate(AESTDT) as 'Raw Start Date' from `EDC`.`AE` where @Form.Status = 'submitted__v'or @HDR.Event.Status in ('did_not_occur__v')
在此示例中,CQL 以原始格式返回 AESTDT 作为“原始开始日期”。
此查询以原始格式返回受试者 DOB 条目的日期值。
SDTMDATEFORMAT
以 SDTM(ISO 8061)格式返回给定日期或日期时间,并自动处理日期的未知部分(如果存在)。该值以字符串形式返回。请参阅以下 SDTM 格式的部分日期列表。
语法
SDTMDateFormat(<date>)
示例
SELECT SDTMDateFormat(mh.condition_start_date) from EDC.medical_history
此查询以 SDTM 格式返回条件开始日期条目的日期值,并处理任何未知部分。
STR_TO_DATE
给定一个字符串及其日期格式,返回一个日期。请参阅以下日期说明符列表。
语法
SELECT STR_TO_DATE('<string>', '<format>')
示例
SELECT STR_TO_DATE('January 01, 2021', '%M %d, %Y')
此查询返回 2021 年 1 月 1 日作为日期。
CURDATE
以 YYYY-MM-DD 格式返回当前日期
示例
SELECT CURDATE() FROM Demographics
此查询返回当前日期。
NOW
以“YYYY-MM-DD hh:mm:ss”格式返回当前日期和时间。
示例
SELECT NOW() FROM Demographics
此查询返回当前日期和时间。
YEAR
返回给定日期的年份。
语法
YEAR('date')
示例
SELECT YEAR('2019-12-12') FROM Demographics
此函数返回“2019”,即 2019 年 12 月 12 日的年份。
MONTH
返回给定日期的月份。
语法
MONTH('date')
示例
SELECT MONTH('2019-12-12') FROM Demographics
此函数返回“12”,即 2019 年 12 月 12 日的月份。
WEEK
返回给定日期在一年中的周数。
语法
WEEK('date')
示例
SELECT WEEK('2019-12-12') FROM Demographics
此函数返回“50”,即 2019 年 12 月 12 日在一年中的周数。
DAY
返回给定日期的日期。
语法
DAY('date')
示例
SELECT DAY('2019-12-12') FROM Demographics
此函数返回“12”,即 2019 年 12 月 12 日的日期。
HOUR
返回给定时间的小时。
语法
HOUR('time')
示例
SELECT HOUR('10:05:03') FROM Demographics
此函数返回“10”,即 10:05:03 的小时。
MINUTE
返回给定时间的分钟。
语法
MINUTE('time')
示例
SELECT MINUTE('10:05:03') FROM Demographics
此函数返回“05”,即 10:05:03 的分钟。
SECOND
返回给定时间的秒数。
语法
SECOND('time')
示例
SELECT SECOND('10:05:03') FROM Demographics
此函数返回“03”,即 10:05:03 的秒数。
LAST_DAY
返回给定日期所在月份的最后一天。
语法
LAST_DAY('date'), LAST_DAY(DATAITEM)
示例
SELECT LAST_DAY(@HDR.Event.Date)
此查询返回事件日期所在月份的最后一天。例如,如果事件日期为 2019 年 11 月 15 日,则此查询返回“30”,即 11 月的最后一天。
未知日期
Workbench 支持在 CQL 查询中引用来自 Vault EDC 或第三方数据的未知日期和日期时间。Workbench 允许以下未知日期和时间选项:
- 月、日和时间
- 日和时间
- 时间
默认情况下,Workbench 将未知日期部分转换为该月的第一天或该年的第一月,将未知时间转换为 00:00:00。这可以普遍处理日期,而无需担心未知日期和时间。
Unknown
如果日期包含未知部分(M
、D
和 T
),则返回未知的日期部分,否则返回字符串 COMPLETE
。
语法
Unknown(Date)
示例
Unknown(edc.mh_condition_start_date)
在此示例中,病史表单中的条件开始日期条目允许使用未知的月份、日期和时间。如果 EDC 用户输入了“07-17-2021 5:15”,该函数将返回 COMPLETE
,因为输入的日期没有未知部分。如果 EDC 用户输入了“06-?-2005 ?”,该函数将返回 D,T
,因为该日期的日期和时间未知。
UnknownImpute
此函数允许用户指定表示未知部分的方式。给定一个条目,该函数使用原始日期值确定日期是否包含未知部分,然后应用提供的逻辑来处理未知部分。结果是日期数据类型的值。如果值不包含任何未知部分,则该函数将返回默认日期。
语法
UnknownImpute(Item, 'day impute type', 'month impute type', 'time impute type')
推断类型:
必须输入每种推断类型,即使日期或日期时间不允许包含这些未知部分。请注意,输入类型必须用单引号(‘)括起来。
- 天:
FIRST DAY
:月份的第一天。LAST DAY
:月份的最后一天。MID DAY
:月份的第 15 天。
- 月:
FIRST MONTH
:一月(1)LAST MONTH
:十二月(12)MID MONTH
:六月(6)
- 时间:
FIRST HOUR
:00:00(24 小时制)LAST HOUR
:23:59(24 小时制)MID HOUR
:12:00(24 小时制)
示例
UnknownImpute(edc.ae_start_datetime, 'FIRST DAY', 'FIRST MONTH', 'FIRST HOUR')
在此示例中,AE 开始日期时间条目允许时间包含未知部分。此查询返回未知时间设置为 12:00 AM 的 AE 开始日期时间。例如,如果在 EDC 中输入的日期时间是“Jul 22, 2021 ?”,则 CQL 将返回“Jul 22, 2021 12:00 AM”。
日期和时间说明符&
以下是在 CQL 中可用的日期和时间说明符:
说明符 | 定义 |
---|---|
%r |
时间,12 小时制(hh:mm:ss,后跟 AM 或 PM) |
%T |
时间,24 小时制(hh:mm:ss) |
%I |
小时,12 小时制,带前导零(01..12) |
%l |
小时,12 小时制,不带前导零(01..12) |
%k |
小时,24 小时制,带前导零(01..24) |
%i |
分钟,数值(00..59) |
%S |
秒(00..59) |
%s |
秒(00..59),与 %S 相同 |
%f |
微秒(000000..999999) |
%p |
AM 或 PM |
%d |
月份中的某日,数值(00..31) |
%e |
月份中的某日,数值,不带前导零(0..31) |
%D |
月份中的某日,带有英文后缀(0th、1st、2nd、3rd...) |
%j |
一年中的某日(001..366) |
%w |
周几(0 是周日..6 是周六) |
%W |
星期名称(周日..周六) |
%a |
星期名称,缩写(Sun..Sat) |
%M |
月份名称(一月..十二月) |
%b |
月份名称,缩写(Jan..Dec) |
%m |
月份,数值(00..12) |
%Y |
年份,数值,4 位数 |
%y |
年份,数值,2 位数 |
%U |
周(00..53),其中周日是一周的第一天,周()模式 0 |
%u |
周(00..53),其中周一是一周的第一天,周()模式 1 |
%V |
周(00..53),其中周日是一周的第一天,周()模式 2;与 %X 一起使用 |
%v |
周(00..53),其中周一是一周的第一天,周()模式 3;与 %x 一起使用 |
%X |
周所在年份,数值,周日是一周的第一天;与 %V 一起使用 |
%x |
周所在年份,数值,周一是一周的第一天;与 %v 一起使用 |
%% |
文字 % 字符 |
% x |
x,以上未列出的任何“x” |
原始格式日期
记录的日期或日期时间 | 原始格式 | |
---|---|---|
1 | 27-10-2020 | 27-10-2020 |
2 | ?-10-2020 | UN-10-2020 |
3 | ?-?-2020 | UN-UNK-2020 |
4 | 27-10-2020 10:40 | 27-10-2020 10:40 |
5 | 27-10-2020 ? | 27-10-2020 UN:UN |
6 | ?-10-2020 ? | UN-10-2020 UN:UN |
7 | ?-?-2020 ? | UN-UNK-2020 UN:UN |
SDTM 格式日期
记录的日期或日期时间 | 不确定性区间 | 标称日期/时间(--DTC) | |
---|---|---|---|
1 | 2020 年 3 月 15 日 13:14:17 | 完成日期 | 2020-03-14T13:14:17 |
2 | 2020 年 3 月 15 日 13:14 | 未知秒数 | 2020-03-15T13:14 |
3 | 2020 年 3 月 15 日 13 | 未知分钟数 | 2020-03-15T13 |
4 | 2020 年 3 月 15 日 | 未知时间 | 2020-03-15 |
5 | 2020 年 3 月 | 未知日 | 2020-03 |
6 | 2020 | 未知月份 | 2020 |
其他
以下函数也可用于 CQL 查询:
CAST
Cast 函数采用数据条目或表达式参数,并以指定的数据类型返回结果。
语法
CAST(item AS data_type) CAST (expression AS data_type
以下数据类型可在 CAST 函数中使用:
- 二进制(Binary)
- 字符(CHAR)
- 日期(DATE)
- 日期时间(DATETIME)
- 时间(TIME)
- 十进制(DECIMAL)
- SIGNED
- 未签名(UNSIGNED)
示例
SELECT CAST(Exclusion_Criteria.Hypersensitivity_Constituents as CHAR) FROM Demographics
此查询以文本(字符)形式返回超敏反应成分代码列表类型条目中的代码列表条目值(Y 或 N)。
FIELD
返回字符串列表中条目值的索引或位置。这对于自定义结果集中可能值列表的顺序非常有用。
语法
FIELD(DATAITEM, '<string1>', '<string2>','<stringN>')
示例
SELECT @HDR.Subject, Route, Dosage_Amount FROM Dosing ORDER BY FIELD(Route, 'Oral', 'Nasal', 'Topical')
此查询返回受试者级标题信息以及途径和剂量条目值,按口服、鼻用、外用的途径排序。
UNION
Union 将多个 SELECT
语句的结果合并为一个结果集。CQL 使用第一个 SELECT
语句中列出的列名作为列名。针对第一个 SELECT
语句中的列,后续 SELECT
语句中的相应列必须为相同的数据类型。例如,如果第一个语句的第二列是整数,则第二个 SELECT
语句的第二列也必须是整数。
UNION
返回集合中查询的所有可能结果行,UNION ALL
也是如此。可以使用 UNION DISTINCT
仅检索集合中查询的唯一结果行。UNION DISTINCT
仅删除 100% 匹配的重复行。
Union 限制:CQL 对 UNION 操作的限制为 4000。
语法
SELECT ItemGroup.Item, ItemGroup.Item FROM Form1 UNION SELECT ItemGroup.Item, ItemGroup.Item FROM Form2
示例
SELECT test.date_collected, test.rbc, test.wbc FROM LocalLabs.Hematology UNION SELECT chem.date_collected, chem.total_protein, chem.urea_nitrogen FROM CentralLabs.Chemistry
UNPIVOT
UnPivot 是一个关系运算符,可用于将表的列转换为列值。UnPivot 中不能包含任何 @HDR 值,也不能在 WHERE、GROUP BY 或 ORDER BY 子句中引用任何列转行数据条目。
在当前版本中,CDB 不会对使用 UnPivot
的 CQL 语句列表显示单元格高亮。
语法
SELECT up.@HDR.Subject.Name, up_items FROM ( SELECT @HDR.Subject.Name, itemA, itemB, itemC, itemD) up UNPIVOT ( up_items FOR items in (itemA, itemB, itemC, itemD) ) as unpivot_table
示例:Unpivot
SELECT up.@HDR.Subject.Name up_items FROM ( SELECT @HDR.Subject.Name, body_temperature, height, weight, systolic_blood_pressure__mmhg_, diastolic_blood_pressure__mmhg_, pulse__bpm_ FROM Vitals) up UNPIVOT ( up_items FOR items in (body_temperature, height, weight, systolic_blood_pressure__mmhg_, diastolic_blood_pressure__mmhg_, pulse__bpm_) ) as unpivot_table
示例:多个 Unpivot 部分
SELECT @HDR.Subject.Name, @HDR.Event, Body_Temperature, vsResult, vsTest, VSSTAT, HIDe FROM ( SELECT @HDR.Subject.Name, Body_Temperature, Height, Weight, ILB(Body_Temperature), ILB(Height), ILB(Weight) From EDC.Vitals) main UNPIVOT (vsResult FOR vsTest in (Body_Temperature, Height, Weight)) as result UNPIVOT (VSSTAT FOR HIDe in (ILB(Body_Temperature), ILB(Height), ILB(Weight))) as ilb
示例:多个表单上 Unpivot:
SELECT @HDR.Subject.Name, d.MHTERM, b.Please_specify_abnormality AS term, up_item.vs_result, up_item.vs_test FROM (SELECT body_temperature, height, weight, systolic_blood_pressure__mmHg_, diastolic_blood_pressure__mmHg_, pulse__bpm_ FROM vitals) AS main UNPIVOT (vs_result FOR vs_test IN (body_temperature, systolic_blood_pressure__mmHg_, diastolic_blood_pressure__mmHg_, pulse__bpm_)) AS up_item, baseline_chest_x-ray_evaluation b, demographics d WHERE main.@HDR.Subject.ID = b.@HDR.Subject.ID AND main.@HDR.Subject.ID = d.@HDR.Subject.ID
不支持的使用情况:
当前版本不支持以下使用情况:
- 子查询中的 UnPivot
- Union 中的 UnPivot
- 在 UnPivot 中引用 @Form 或 @ItemGroup 属性
子查询中的 UnPivot:
SELECT @HDR.Subject.Name, creation_criteria.subject_initials, creation_criteria.subject_dob, up.* FROM demographics.creation_criteria (SELECT @HDR.Subject.Name, up_item.vs_test, up_item.vs_result FROM (SELECT body_temperature, height, weight, systolic_blood_pressure__mmhg_, diastolic_blood_pressure__mmhg_, pulse__bpm_ FROM Vitals) as main UNPIVOT (vs_result FOR vs_test IN (body_temperature, height, weight, systolic_blood_pressure__mmhg_, diastolic_blood_pressure__mmhg_, pulse__bpm_)) AS up_item) AS up WHERE d.@HDR.Subject.Name = up.@HDR.Subject.Name
Union 中的 UnPivot:
SELECT @HDR.Subject.Name, @HDR.Event.Name, up_item.* FROM (SELECT body_temperature, height, weight, systolic_blood_pressure__mmHg_, diastolic_blood_pressure__mmHg_, pulse__bpm_ FROM vitals) AS main UNPIVOT (vs_result FOR vs_test IN (vody_temperature, systolic_blood_pressure__mmHg_, diastolic_blood_pressure__mmHg_, pulse__bpm_)) AS up_item UNION ALL SELECT @HDR.Subject.Name, @HDR.Event.Name, up_item.* FROM (SELECT WBC, RBC, HEMOGLOBIN, HEMATOCRIT, PLATELET, NEUTROPHILS FROM hematology) AS main UNPIVOT (vs_result FOR vs_test IN (WBC, RBC, HEMOGLOBIN, HEMATOCRIT, PLATELET, NEUTROPHILS)) AS up_item;
其他可用函数
以下 SQL 函数也可在 CQL 中使用:
函数 | 描述 |
---|---|
ABS() | 返回绝对值 |
ACOS() | 返回反余弦 |
ADDTIME() | 添加时间 |
ASCII() | 返回最左侧字符的数值 |
ASIN() | 返回反正弦 |
ATAN() | 返回反正切 |
ATAN2(), ATAN() | 返回两个参数的反正切 |
BIN() | 返回包含数字二进制表示的字符串 |
BINARY | 将字符串转换为二进制字符串 |
BIT_AND() | 返回按位与 |
BIT_COUNT() | 返回设置的位数 |
BIT_LENGTH() | 返回参数的位长度 |
BIT_OR() | 返回按位或 |
BIT_XOR() | 返回按位异或 |
CEIL() | 返回不小于参数的最小整数值 |
CEILING() | 返回不小于参数的最小整数值 |
CHAR() | 返回每个传递整数对应的字符 |
CHAR_LENGTH() | 返回参数中的字符数 |
CHARACTER_LENGTH() | CHAR_LENGTH() 的同义词 |
CHARSET() | 返回参数的字符集 |
COERCIBILITY() | 返回字符串参数的排序规则强制性值 |
COLLATION() | 返回字符串参数的排序规则 |
CONV() | 在不同的数字基数之间转换数字 |
CONVERT_TZ() | 从一个时区转换到另一个时区 |
COS() | 返回余弦值 |
COT() | 返回余切值 |
COUNT(DISTINCT) | 返回不同值的计数 |
CURRENT_DATE(), CURRENT_DATE | CURDATE() 的同义词 |
CURRENT_TIME(), CURRENT_TIME | CURTIME() 的同义词 |
CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP | NOW() 的同义词 |
CURTIME() | 返回当前时间 |
DATE_ADD() | 向日期中添加一个值(间隔) |
DATE_FORMAT() | 按照指定格式设置日期格式 |
DATE_SUB() | 从日期中减去一个值(间隔) |
DAY() | DAYOFMONTH() 的同义词 |
DAYNAME() | 返回星期的名称 |
DAYOFMONTH() | 返回月份中的某日(0-31) |
DAYOFWEEK() | 返回参数的星期索引 |
DAYOFYEAR() | 返回一年中的某日(1-366) |
DEGREES() | 将弧度转换为度数 |
ELT() | 返回索引号处的字符串 |
EXP() | 指数运算 |
EXPORT_SET() | 返回一个字符串,每个设置的位对应一个“on”字符串,未设置的位对应“off”字符串 |
EXTRACT() | 提取日期的一部分 |
FIND_IN_SET() | 返回第一个参数在第二个参数中的索引(位置) |
FLOOR() | 返回不大于参数的最大整数值 |
FORMAT() | 返回格式化为指定小数位数的数字 |
FOUND_ROWS() | 对于带有 LIMIT 子句的 SELECT,返回如果没有 LIMIT 子句将返回的行数 |
FROM_BASE64() | 解码 base64 编码的字符串并返回结果 |
FROM_DAYS() | 将天数转换为日期 |
FROM_UNIXTIME() | 将 Unix 时间戳格式化为日期 |
GET_FORMAT() | 返回日期格式字符串 |
GREATEST() | 返回最大的参数 |
HEX() | 十六进制表示的十进制或字符串值 |
INSERT() | 在指定位置插入子字符串,最多插入指定数量的字符 |
INSTR() | 返回子字符串第一次出现的索引 |
INTERVAL() | 返回参数中小于第一个参数的索引 |
ISNULL() | 测试参数是否为 NULL |
LCASE() | LOWER() 的同义词 |
LEAST() | 返回最小的参数 |
LN() | 返回参数的自然对数 |
LOCALTIME(), LOCALTIME | NOW() 的同义词 |
LOCALTIMESTAMP, LOCALTIMESTAMP() | NOW() 的同义词 |
LOCATE() | 返回子字符串第一次出现的位置 |
LOG() | 返回第一个参数的自然对数 |
LOG10() | 返回参数的以 10 为底的对数 |
LOG2() | 返回参数的以 2 为底的对数 |
LPAD() | 返回字符串参数,左侧填充指定的字符串 |
MAKE_SET() | 返回有对应位设置的逗号分隔字符串集合 |
MAKEDATE() | 根据年份和年份的日期创建日期 |
MAKETIME() | 根据小时、分钟、秒创建时间 |
MICROSECOND() | 返回参数中的微秒数 |
MOD() | 返回余数 |
MONTHNAME() | 返回月份的名称 |
NAME_CONST() | 使列具有给定的名称 |
NULLIF() | 如果 expr1 = expr2,则返回 NULL |
OCT() | 返回包含数字八进制表示的字符串 |
OCTET_LENGTH() | LENGTH() 的同义词 |
ORD() | 返回参数最左侧字符的字符代码 |
PERIOD_ADD() | 向年-月添加期间 |
PERIOD_DIFF() | 返回期间之间的月数 |
PI() | 返回圆周率的值 |
POSITION() | LOCATE() 的同义词 |
POW() | 返回参数提升到指定的幂 |
POWER() | 返回参数提升到指定的幂 |
QUARTER() | 返回日期参数的季度 |
QUOTE() | 对参数进行转义以用于 SQL 语句 |
RADIANS() | 返回参数转换后的弧度 |
RAND() | 返回一个随机的浮点值 |
RANDOM_BYTES() | 返回一个随机字节向量 |
REPEAT() | 重复字符串指定的次数 |
REVERSE() | 反转字符串中的字符 |
ROUND() | 对参数进行四舍五入 |
ROW_COUNT() | 更新的行数 |
RPAD() | 追加字符串指定的次数 |
SEC_TO_TIME() | 将秒转换为 'hh:mm:ss' 格式 |
SIGN() | 返回参数的符号 |
SIN() | 返回参数的正弦值 |
SPACE() | 返回指定数量的空格字符串 |
SQRT() | 返回参数的平方根 |
STD() | 返回总体标准差 |
STDDEV() | 返回总体标准差 |
STDDEV_POP() | 返回总体标准差 |
STDDEV_SAMP() | 返回样本标准差 |
STRCMP() | 比较两个字符串 |
SUBSTRING() | 返回指定的子字符串 |
SUBSTRING_INDEX() | 返回以指定分隔符的指定次数出现的子字符串 |
SUBTIME() | 减去时间 |
SYSDATE() | 返回函数执行时的时间 |
TAN() | 返回参数的正切值 |
TIME() | 提取传递表达式的时间部分 |
TIME_FORMAT() | 按时间格式化 |
TIME_TO_SEC() | 返回转换为秒的参数 |
TIMEDIFF() | 减去时间 |
TIMESTAMP() | 传入单个参数时返回日期或日期时间表达式;传入两个参数时返回两者的总和 |
TIMESTAMPADD() | 向日期时间表达式添加一个间隔 |
TO_BASE64() | 返回转换为 base-64 字符串的参数 |
TO_DAYS() | 返回日期参数转换为天数 |
TO_SECONDS() | 返回日期或日期时间参数自 0 年起转换为秒的结果 |
TRUNCATE() | 截断为指定的小数位数 |
UCASE() | UPPER() 的同义词 |
UNHEX() | 返回包含数字十六进制表示的字符串 |
UNIX_TIMESTAMP() | 返回 Unix 时间戳 |
UTC_DATE() | 返回当前 UTC 日期 |
UTC_TIME() | 返回当前 UTC 时间 |
UTC_TIMESTAMP() | 返回当前 UTC 日期和时间 |
UUID() | 返回通用唯一标识符(UUID) |
UUID_SHORT() | 返回整数值通用标识符 |
VALUES() | 定义插入操作中使用的值 |
VAR_POP() | 返回总体标准方差 |
VAR_SAMP() | 返回样本方差 |
VARIANCE() | 返回总体标准方差 |
WEEK() | 返回周数 |
WEEKDAY() | 返回星期索引 |
WEEKOFYEAR() | 返回日期的日历周(1-53) |
WEIGHT_STRING() | 返回字符串的权重字符串 |
YEARWEEK() | 返回年份和星期 |
CQL 错误
如果收到通用的 CQL 运行时错误(错误代码 0001 到 0010),请联系 Veeva 支持部门。