前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在 Swift 中使用 SQL 组合人员和地址数据

在 Swift 中使用 SQL 组合人员和地址数据

原创
作者头像
Swift社区
发布2025-01-27 19:15:58
发布2025-01-27 19:15:58
980
举报
文章被收录于专栏:Swift社区Swift社区

摘要

在本篇文章中,我们将讨论如何结合两个表——PersonAddress,以便生成包含每个人的姓名和地址信息的结果表。如果某人的地址信息不存在,则对应的城市和州返回为 null。我们将用 Swift 和 SQLite 数据库实现这一功能,并详细分析其逻辑。

描述

问题描述

我们有两张表:

Person 表:

列名

类型

PersonId

int

FirstName

varchar

LastName

varchar

PersonId 是主键,用于存储每个人的基本信息,包括姓和名。

Address 表:

列名

类型

AddressId

int

PersonId

int

City

varchar

State

varchar

AddressId 是主键,存储每个人的城市和州信息,PersonId 是外键关联到 Person 表。

目标: 报告 Person 表中每个人的 FirstNameLastNameCityState。如果某人的地址信息在 Address 表中缺失,则其 CityState 返回 null

示例输入与输出

输入

Person 表:

PersonId

LastName

FirstName

1

Wang

Allen

2

Alice

Bob

Address 表:

AddressId

PersonId

City

State

1

2

New York City

New York

2

3

Leetcode

California

输出

FirstName

LastName

City

State

Allen

Wang

Null

Null

Bob

Alice

New York City

New York

解释

  • PersonId = 1Address 表中没有对应的地址信息,返回 null
  • PersonId = 2Address 表中找到其地址信息。

Swift 代码解决方案

以下是用 Swift 和 SQLite 数据库实现的代码:

代码语言:swift
复制
import SQLite3

def fetchPersonWithAddress() {
    // Database setup
    var db: OpaquePointer?
    let databasePath = ":memory:" // Use in-memory database for demo
    if sqlite3_open(databasePath, &db) != SQLITE_OK {
        print("Failed to open database")
        return
    }

    // Create tables
    let createPersonTable = """
    CREATE TABLE Person (
        PersonId INTEGER PRIMARY KEY,
        FirstName TEXT,
        LastName TEXT
    );
    """

    let createAddressTable = """
    CREATE TABLE Address (
        AddressId INTEGER PRIMARY KEY,
        PersonId INTEGER,
        City TEXT,
        State TEXT
    );
    """

    if sqlite3_exec(db, createPersonTable, nil, nil, nil) != SQLITE_OK ||
       sqlite3_exec(db, createAddressTable, nil, nil, nil) != SQLITE_OK {
        print("Failed to create tables")
        sqlite3_close(db)
        return
    }

    // Insert sample data
    let insertPersonData = """
    INSERT INTO Person (PersonId, FirstName, LastName) VALUES
    (1, 'Allen', 'Wang'),
    (2, 'Bob', 'Alice');
    """

    let insertAddressData = """
    INSERT INTO Address (AddressId, PersonId, City, State) VALUES
    (1, 2, 'New York City', 'New York'),
    (2, 3, 'Leetcode', 'California');
    """

    if sqlite3_exec(db, insertPersonData, nil, nil, nil) != SQLITE_OK ||
       sqlite3_exec(db, insertAddressData, nil, nil, nil) != SQLITE_OK {
        print("Failed to insert data")
        sqlite3_close(db)
        return
    }

    // Query data with LEFT JOIN
    let query = """
    SELECT Person.FirstName, Person.LastName, Address.City, Address.State
    FROM Person
    LEFT JOIN Address ON Person.PersonId = Address.PersonId;
    """

    var statement: OpaquePointer?
    if sqlite3_prepare_v2(db, query, -1, &statement, nil) == SQLITE_OK {
        print("FirstName | LastName | City          | State")
        while sqlite3_step(statement) == SQLITE_ROW {
            let firstName = String(cString: sqlite3_column_text(statement, 0))
            let lastName = String(cString: sqlite3_column_text(statement, 1))
            let city = sqlite3_column_text(statement, 2).flatMap { String(cString: $0) } ?? "Null"
            let state = sqlite3_column_text(statement, 3).flatMap { String(cString: $0) } ?? "Null"
            print("\(firstName) | \(lastName) | \(city) | \(state)")
        }
    } else {
        print("Failed to execute query")
    }

    sqlite3_finalize(statement)
    sqlite3_close(db)
}

fetchPersonWithAddress()

代码分析

  1. 表创建与数据插入
    • 使用 SQL 创建 PersonAddress 表,并插入示例数据。
  2. 数据查询
    • 通过 LEFT JOIN 查询数据。左连接确保即使 Address 表中没有对应的 PersonIdPerson 表的记录也会出现在结果中。
  3. 结果展示
    • 使用 sqlite3_step 遍历查询结果,并处理可能的 null 值。

示例测试及结果

输出结果

代码语言:txt
复制
FirstName | LastName | City          | State
Allen     | Wang     | Null          | Null
Bob       | Alice    | New York City | New York

时间复杂度

  • 查询操作: LEFT JOIN 的时间复杂度为 O(n + m),其中 nm 分别是 PersonAddress 表的大小。

空间复杂度

  • 额外空间: 用于存储查询结果,复杂度为 O(k),其中 k 是结果行数。

总结

本文通过 Swift 和 SQLite 实现了对两个表的合并查询,并处理了地址缺失的情况。代码逻辑清晰,适合实际应用场景如用户数据整合或报告生成。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 描述
    • 问题描述
    • 示例输入与输出
  • Swift 代码解决方案
  • 代码分析
  • 示例测试及结果
  • 时间复杂度
  • 空间复杂度
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档