使用AI建構SQL查詢 | 原創,AI翻譯

Home 2025.07

資料庫架構 (PostgreSQL):

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    first_name VARCHAR(100),
    last_name VARCHAR(100),
    date_of_birth DATE,
    gender VARCHAR(10),
    phone_number VARCHAR(20),
    address TEXT,
    city VARCHAR(100),
    state VARCHAR(100),
    country VARCHAR(100),
    zip_code VARCHAR(20),
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE,
    last_login TIMESTAMP WITH TIME ZONE,
    is_active BOOLEAN DEFAULT TRUE,
    role VARCHAR(50),
    profile_picture_url VARCHAR(255),
    bio TEXT,
    failed_login_attempts INTEGER DEFAULT 0,
    account_balance NUMERIC(10, 2) DEFAULT 0.00
);

以上是 Postgre 資料庫,以下是表格定義。以下是自然語言查詢指示。

我要查詢一些用戶,其名字是 Andy,創建時間在上個月的某一天,且在 2025 年時年齡為 20 歲,並且最近一週有登入過,請給我查詢這些用戶的 SQL 語句。


生成的 SQL 查詢:

SELECT *
FROM users
WHERE first_name ILIKE 'andy'
  AND CAST(created_at AS DATE) BETWEEN
      (CURRENT_DATE - INTERVAL '1 MONTH' - INTERVAL '1 DAY')
      AND
      (CURRENT_DATE - INTERVAL '1 MONTH' + INTERVAL '1 DAY')
  AND EXTRACT(YEAR FROM AGE(date_of_birth)) = 20
  AND last_login >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';

以下是一個 PostgreSQL 表格定義,用於儲存用戶與類似 Grok 的 AI 系統的互動。該表格旨在追蹤對話,包括涉及的用戶、對話內容、時間戳記和相關元數據。

CREATE TABLE conversations (
    id SERIAL PRIMARY KEY,
    user_id INTEGER NOT NULL,
    title VARCHAR(255),
    conversation_type VARCHAR(50) DEFAULT 'chat',
    started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    ended_at TIMESTAMP WITH TIME ZONE,
    status VARCHAR(50) DEFAULT 'active',
    message_count INTEGER DEFAULT 0,
    last_message_at TIMESTAMP WITH TIME ZONE,
    is_archived BOOLEAN DEFAULT FALSE,
    ai_model_version VARCHAR(100),
    total_tokens_used INTEGER DEFAULT 0,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP WITH TIME ZONE,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

說明:

此表格設計靈活,可根據特定需求擴展,例如在單獨的 messages 表格中儲存個別訊息,或添加用於情感分析或對話標籤的欄位。請告訴我如果需要相關表格(例如用於訊息的表格)或與此表格互動的查詢!


為了實現一個前端,讓用戶可以使用自然語言查詢自己的對話(例如 “給我最新的 5 個對話” 或 “標題包含 java 字詞的對話”),您需要確保 SQL 查詢僅限於過濾到已驗證用戶的對話。這涉及將用戶身份(例如 user_id)納入查詢並將自然語言轉換為 SQL 條件。以下是針對 conversations 表格的提示和對應的 SQL 查詢,確保用戶只能訪問自己的數據。

關鍵考量

自然語言提示和 SQL 查詢

提示 1:”給我最新的 5 個對話”

解析需求

SQL 查詢

SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;

提示 2:”標題包含 java 字詞的對話”

解析需求

SQL 查詢

SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
  AND title ILIKE '%java%';

前端實現注意事項

  1. 用戶驗證
    • 前端必須從驗證的會話(例如 JWT 令牌或會話)中獲取用戶的 ID,並將其傳遞給後端 API。
    • 後端應驗證 user_id 並在 WHERE 子句中使用它來過濾結果。
  2. 自然語言處理
    • 使用簡單的規則基礎解析器或 AI 模型(如 Grok)來解析自然語言查詢並提取:
      • 意圖:列出對話。
      • 篩選條件:關鍵字(例如 “java”)、排序(例如 “最新”)或限制(例如 “5”)。
    • 例如,將 “最新 5” 映射到 ORDER BY started_at DESC LIMIT 5,將 “標題有 java 字詞” 映射到 title ILIKE '%java%'
  3. API 設計
    • 創建一個端點(例如 /api/conversations),接受:
      • user_id:來自驗證的會話。
      • query:自然語言輸入或結構化參數(例如 { filter: "title contains java" })。
    • 後端將查詢轉換為 SQL,確保 user_id 始終包含在 WHERE 子句中。
  4. 安全性
    • 不要允許用戶直接輸入 SQL 或修改 user_id 篩選條件。
    • 使用參數化查詢(例如 :authenticated_user_id)來防止 SQL 注入。
    • 驗證輸入以避免 ILIKE 搜索中的惡意模式。
  5. 前端顯示
    • 返回字段如 idtitlestarted_atlast_message_atstatus 以顯示對話列表。
    • 在 UI 中允許排序或篩選選項(例如下拉菜單用於 “最新” 或文本輸入用於標題搜索)。

示例工作流程

  1. 用戶登入,前端獲取其 user_id(例如 123)。
  2. 用戶在搜索欄中輸入 “給我最新的 5 個對話”。
  3. 前端將請求發送到後端:/api/conversations?user_id=123&query=latest 5
  4. 後端解析查詢,生成 SQL:
    SELECT *
    FROM conversations
    WHERE user_id = 123
    ORDER BY started_at DESC
    LIMIT 5;
    
  5. 後端以 JSON 格式返回結果,前端顯示對話。

其他說明

請告訴我如果需要幫助前端代碼、後端 API 設置或其他查詢示例!


Back Donate