Direct Query
DIRECT QUERY 语句可让您使用 Direct Discovery 函数通过 ODBC 或 OLE DB 连接访问表格。
语法:
DIRECT QUERY DIMENSION fieldlist [MEASURE fieldlist] [DETAIL fieldlist] FROM tablelist
[WHERE where_clause]
DIMENSION、MEASURE 和 DETAIL 关键字可以按任何顺序使用。
DIMENSION 和 FROM 关键字子句在所有 DIRECT QUERY 语句中都是必需的。FROM 关键字必须在 DIMENSION 关键字后面。
DIMENSION 关键字后面直接指定的字段在内存中加载,并且可用于创建内存中数据与 Direct Discovery 数据之间的关联。
使用 MEASURE 关键字,您可以定义 Qlik Sense 在“元级别”识别的字段。在数据加载过程中度量字段的实际数据只驻留在数据库中,并且通过在可视化中使用的图表表达式推动进行临时检索。
通常,具有用作维度离散值的字段应使用 DIMENSION 关键字加载,而只用于聚合的数字应使用 MEASURE 关键字来选择。
DETAIL 字段提供用户可能希望在“钻取至详细信息”表窗格中显示的信息或详细信息,如注释字段。DETAIL 字段不能用于图表表达式中。
按照设计,DIRECT QUERY 语句是数据源的中立数据源,用于支持 SQL。由于此原因,可以将同一 DIRECT QUERY 语句用于不同的 SQL 数据库,不需要进行任何更改。Direct Discovery 根据需要生成相应的数据库查询。
如果用户知道要查询的数据库并希望利用 SQL 的数据库特定扩展名,可以使用本地数据源语法。支持本地数据源语法:
- 作为 DIMENSION 和 MEASURE 子句中的字段表达式
- 作为 WHERE 子句的内容
示例:
DIMENSION Dim1, Dim2MEASURENATIVE ('X % Y') AS X_MOD_Y
DIMENSION Dim1, Dim2MEASURE X, YFROM TableNameWHERE NATIVE ('EMAIL MATCHES "\*.EDU"')
参数:
参数 | 说明 |
---|---|
fieldlist |
字段规范的逗号分隔列表, fieldname {, fieldname}. 字段规范可以是字段名称,在此情况下,相同名称用于数据库列名称和 Qlik Sense 字段名称。字段规范也可以是“字段别名”,在此情况下,数据库表达式或列名称被给予 Qlik Sense 字段名称。 |
tablelist |
数据库中将从其中加载数据的表格或视图的名称列表。通常是包含在数据库中执行的联接的视图。 |
where_clause |
此处没有定义数据库 WHERE 子句的完整语法,但允许使用大部分 SQL“关系表达式”,包括使用函数调用、字符串的 LIKE 运算符、IS NULL 和 IS NOT NULL,不包括 IN. BETWEEN。 NOT 是一元运算符,而非某些关键字的修饰符。 示例: WHERE x > 100 AND "Region Code" IN ('south', 'west')
WHERE Code IS NOT NULL and Code LIKE '%prospect'
WHERE NOT X in (1,2,3)
不能将最后一个示例写成如下所示: WHERE X NOT in (1,2,3)
|
示例:
在本例中,使用了称为 TableName 的数据库表,包含字段 Dim1、Dim2、Num1、Num2 和 Num3。Dim1 和 Dim2 将被载入 Qlik Sense 数据集。
可将 Dim1 和 Dim2 用作维度。Num1、Num2 和 Num3 均可用于聚合。Dim1 和 Dim2 也可用于聚合。可以用于 Dim1 和 Dim2 的聚合类型取决于其数据类型。例如,在很多情况下,DIMENSION 字段包含字符串数据,如名称或帐号。这些字段无法求和,但是可以对其进行计数:count(Dim1)。
例如 SELECT 语句:
SQL SELECT
SalesOrderID,
RevisionNumber,
OrderDate,
SubTotal,
TaxAmt
FROM MyDB.Sales.SalesOrderHeader;
可更改为以下 DIRECT QUERY 语句:
DIRECT QUERY
DIMENSION
SalesOrderID,
RevisionNumber
MEASURE
SubTotal,
TaxAmt
DETAIL
OrderDate
FROM MyDB.Sales.SalesOrderHeader;