# 使用 Direct Query 直接存取雲端資料庫

使用 Direct Query 讀取 SQL 資料庫，而無需將資料匯入或載入至記憶體中。

Direct Query 為使用者提供更多關於如何存取其資料的選項，以符合其個人需求。透過 Direct Query 存取資料可讓使用者將資料保留在其底層資料來源中。這提高了使用者與其資料互動的速度，但代價是犧牲了記憶體內 Qlik Cloud 應用程式 所提供的彈性。

一般而言，建議您盡可能將資料匯入 Qlik Cloud。記憶體內 Qlik Cloud 應用程式可讓您更好地自訂體驗並充分利用資料。然而，如果您發現自己處於無法透過匯入資料來實現目標的情況，Direct Query 可能是適合您的解決方案。由於其簡化的功能，Direct Query 應用程式還可以協助新使用者邁出建立功能齊全且快速的記憶體內應用程式的第一步。

您可以使用 資料模型管理員 建立您的 Direct Query 應用程式，以協助選取資料表和欄位，並定義它們之間的關係。如需詳細資訊，請參閱 [建立 Direct Query 應用程式](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/create-direct-query-app.htm)。

您也可以在載入指令碼中使用自訂 SQL 來定義 Direct Query 應用程式的資料模型。這可讓您在建立資料模型時使用變數和 Qlik 運算式。如需詳細資訊，請參閱 [透過自訂 SQL 建立 Direct Query 應用程式](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/create-data-model-custom-sql.htm)。

## Direct Query 使用案例範例

在以下情況下，您可能會考慮使用 Direct Query 而非記憶體內應用程式：

Direct QueryDirect Query 使用案例

| 使用案例 | 用途和說明 |
| --- | --- |
| 大型資料來源 | Direct Query 初始化速度更快且耗用的資源更少。當您的應用程式主要用於監控或狀態報告，且僅進行少數或不進行任何 選取 時，這會非常有用。 |
| 高效的記憶體內應用程式 | Direct Query 提供可快速且輕鬆地將資料切片擷取至 Qlik Cloud 引擎的功能，並對所有受影響的資料表套用篩選。如需詳細資訊，請參閱 [匯出 Direct Query 應用程式設定至範本應用程式](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/export-to-template-app-direct-query.htm) |
| 用於回寫的 Direct Query | 當設定基於 Qlik Automate 的回寫以修改底層資料庫資料時，Direct Query 可以直接顯示修改後的資料庫結果。記憶體內應用程式中的相同功能將需要使用者再次匯入修改後的資料表。 |
| 探索新的資料庫和資料表 | Direct Query 可用於探索全新或不熟悉的資料庫和資料表。這可讓使用者做出明智的決定，以確定是否需要從底層資料來源匯入資料。 |

## 教學課程

如需關於如何使用 Qlik Sense 應用程式的教學課程，請參閱 [教學課程 - 開始瞭解基本知識](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Tutorials/introduction-beginning-with-basics.htm)。

如需關於 Direct Query 的教學課程，請參閱以下內容：

* [Direct Query - 第 1 部分：概觀與操作](https://www.youtube.com/watch?v=ZiTgqYvFFho)

* [Direct Query - 第 2 部分：使用隨選應用程式產生 (ODAG) 的混合分析解決方案](https://www.youtube.com/watch?v=15uIcFY6DJc)

資訊備註Qlik Cloud 中的 Direct Query 功能與 QlikView 中的 Direct Query 陳述式不同。如需詳細資訊，請參閱 [Direct Query](https://help.qlik.com/zh-TW/qlikview/May2022/Subsystems/Client/Content/QV_QlikView/Scripting/ScriptRegularStatements/direct-query.htm)。

## 支援的功能

與記憶體內應用程式相比，Direct Query 應用程式具有不同的功能。

Direct Query 支援以下內容：

* 資料連線類型：

  資訊備註無法在 Direct Query 中使用 Qlik 資料閘道 - 直接存取 資料連線。

  * Amazon Redshift

  * Azure SQL

  * Azure Synapse Analytics

  * Databricks

  * Google BigQuery

  * Microsoft SQL Server

  * PostgreSQL

  * Snowflake

    資訊備註資料連線中支援純量函數的子集。

* 記憶體內資料分析模擬：

  * 集合分析的子集。

  * 跨任意複雜模型的複數資料表圖。記憶體內應用程式的現有模型需求仍將適用。例如，不允許資料表之間的關聯迴圈。

  * 基本彙總類型：

    * Sum

    * Count

    * Min

    * Max

    * Avg

    * Only

  * 基於底層資料庫提供的函數和運算集，進行彙總前和彙總後計算。

* 資料表關係類型：

  * 內部聯結

  * 完整外部聯結

* 迭代模型建立和儀表板建立。

* 視覺化功能：

  * 標準圖：

    * 長條圖

    * 子彈圖

    * 按鈕

    * 組合圖

    * 容器

    * 篩選器窗格

    * 量規

    * KPI

    * 折線圖

    * 地圖

    * Mekko 圖

    * 圓餅圖

    * 散佈圖

    * 表格

    * 文字和影像

    * 瀑布圖

  * 儀表板搭售：

    * 影片播放器

    * 變數輸入

  * 視覺化搭售：

    * 漏斗圖

    * 複數 KPI

    * 雷達圖

    * 桑基圖

    * 文字雲

* 欄位搜尋功能的子集：

  * 不含特殊符號的搜尋字串 (例如，用於模式搜尋的 "\*" 和 "?"，或用於基於運算式之搜尋的 "=") 會被解譯為對完整字串值的首碼搜尋。

  * 模式搜尋符號和功能：

    * "\*" - 任何 0 個或多個符號

    * "?" - 任何單一符號

  * 基於範圍的搜尋 (基於 "&gt;"、"&lt;"、"&gt;="、"&lt;=")：

    * 對於數值，會根據數值偵測下限/上限。例如，&gt;10&lt;100 等同於 &lt;100&gt;10。兩者皆會被解譯為 [SearchedField] &gt; 10 AND [SearchedField] &lt; 100。

    * 對於其他資料類型，下限/上限是透過其在搜尋條件中的順序來偵測。例如，&gt;Value1&lt;Value2 與 &lt;Value2&gt;Value1 不同。在第二種情況下，會假設 Value2 對應於下限，並將被解譯為 [SearchedField] &lt; Value2 OR [SearchedField] &gt; Value1。

  * 基於運算式的搜尋，前提是該運算式符合 Direct Query 限制。

  資訊備註如需記憶體內搜尋功能的完整清單，請參閱 [在選取或視覺化中搜尋](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Selections/SelectionsToolbar/search-selections.htm)。

* $(=...) 運算式中的 Qlik 引擎函數。

  在 Direct Query 中的 KPI 或自訂 SQL 運算式內，可以使用以下 Qlik 指令碼 and 圖表函數：

  * [**GetUserAttr**](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/SystemFunctions/GetUserAttr.htm)

  * [**if**](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ConditionalFunctions/if.htm)

  * [**Chr**](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/Chr.htm)

  * [**Replace**](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/Replace.htm)

  * 常值和字串運算子

  使用上述一或多個選項的運算式將僅在 Qlik 引擎內展開。

  資訊備註不支援在同一個單一 $(=...) 運算式中混合遠端原生 SQL 函數和 Qlik 引擎函數。

  若要結合使用 Qlik 引擎函數和遠端 SQL 資料庫函數 (可選擇包含 + 集合/選取)，請使用巢狀 $(=...) 運算式：

  `$(= ...<EngineFuncs> ... $(=... <set/selection &| Native SQL funcs>) ... )`

  例如：

  `'$(=Replace(GetUserAttr('userEmail'), '$(=Char(111))' , Chr(48)))'`

  在上述巢狀運算式範例中，Replace()、GetUserAttr() 和 Chr() 函數是 Qlik 引擎函數，且包含在最外層的 $(=…) 運算式中。然而，巢狀 $(=Char(111)) 運算式並未參考引擎函數。它是遠端 SQL 資料庫函數 (例如在 MS SQL 中)。

  假設使用者在 Qlik Cloud 中的電子郵件為 'root@qlik.com'，則上述運算式展開將依此順序進行：

  1. 透過遠端 SQL 資料庫展開 $(=CHAR(111)) 非引擎函數，產生小寫字母 o。

  2. 將 CHR(48) 引擎函數展開為字元 "0'。

  3. 將 GetUserAttr('userEmail') 展開為 'root@qlik.com'。

  4. 最後展開 ‘$(=Replace('root@qlik.com', ‘o' , ‘0’)’，最終結果為 'r00t@qlik.com'。

* [Direct Query 限制](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/limitations-direct-query.htm)
* [在 Direct Query 應用程式中建立 ODAG 連結](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/create-odag-links-direct-query.htm)
* [支援的資料類型](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/DirectQuery/data_type_direct_query.htm)