SQL: "IN" Function

本文详细介绍了 SQL 中 IN 函数的使用方法及其语法,并通过多个实例展示了如何利用 IN 函数简化复杂的 OR 条件组合,提高 SQL 查询效率。
 
SQL: "IN" Function

The IN function helps reduce the need to use multiple OR conditions.
译:IN函数有助于减少OR条件的复合使用。
The syntax for the IN function is:
译:IN函数的语法:
SELECT columns
FROM tables
WHERE column1 in (value1, value2, .... value_n);
This SQL statement will return the records where column1 is value1, value2..., or value_n. The IN function can be used in any valid SQL statement - select, insert, update, or delete.
译:该SQL语句将返回column1的值是value1, value2..., 或者value_n的记录。IN函数可以用于任何合法的SQL语句中-select, insert, update, or delete
Example #1
The following is an SQL statement that uses the IN function:
译:下面是一个使用IN函数的SQL语句
SELECT *
FROM supplier
WHERE supplier_name in ( 'IBM', 'Hewlett Packard', 'Microsoft');
This would return all rows where the supplier_name is either IBM, Hewlett Packard, or Microsoft. Because the * is used in the select, all fields from the supplier table would appear in the result set.
译:这将返回supplier_nameIBM, Hewlett Packard, 或者 Microsoft的所有记录。因为在SELECT中使用了*supplier表中所有的字段都会显示在结果集中。
It is equivalent to the following statement:
译:与下面的SQL语句相同:
SELECT *
FROM supplier
WHERE supplier_name = 'IBM'
OR supplier_name = 'Hewlett Packard'
OR supplier_name = 'Microsoft';
As you can see, using the IN function makes the statement easier to read and more efficient.
译:正如你所看到的,使用IN函数使语句更容易读并且有更高的执行效率。
Example #2
You can also use the IN function with numeric values.
译:你也可以同数字使用IN函数
SELECT *
FROM orders
WHERE order_id in (10000, 10001, 10003, 10005);
This SQL statement would return all orders where the order_id is either 10000, 10001, 10003, or 10005.
译:将返回所有order_id10000, 10001, 10003, 或者10005的记录
It is equivalent to the following statement:
译:与下面的SQL语句相同:
SELECT *
FROM orders
WHERE order_id = 10000
OR order_id = 10001
OR order_id = 10003
OR order_id = 10005;
 
Example #3 - "NOT IN"
The IN function can also be combined with the NOT operator.
译:IN函数可以和NOT操作符连用
For example,
SELECT *
FROM supplier
WHERE supplier_name not in ( 'IBM', 'Hewlett Packard', 'Microsoft');
This would return all rows where the supplier_name is neither IBM, Hewlett Packard, or Microsoft. Sometimes, it is more efficient to list the values that you do not want, as opposed to the values that you do want.
译:这将返回supplier_name不是IBM, Hewlett Packard,Microsoft的所有记录。有时,与你想要的数据相反,这样可以更有效的例出你不需要的值。
 
[root@yfw szrengjing.com]# sudo prosodyctl register user szrengjing.com password szrengjing.com:storage_sql error LuaDBI or LuaSQLite3 are required for using SQL databases but neither are installed szrengjing.com:storage_sql error Please install at least one of LuaDBI and LuaSQLite3. See https://prosody.im/doc/depends modulemanager error Error initializing module 'storage_sql' on 'szrengjing.com': /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:274: in function 'prosody.core.storagemanager.open' (...tail calls...) /usr/lib64/prosody/modules/mod_authz_internal.lua:25: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:66: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager error Failed to load storage driver plugin sql on szrengjing.com: /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:274: in function 'prosody.core.storagemanager.open' (...tail calls...) /usr/lib64/prosody/modules/mod_authz_internal.lua:25: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:66: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager warn Falling back to null driver for account_roles storage on szrengjing.com szrengjing.com:storage_sql error LuaDBI or LuaSQLite3 are required for using SQL databases but neither are installed szrengjing.com:storage_sql error Please install at least one of LuaDBI and LuaSQLite3. See https://prosody.im/doc/depends modulemanager error Error initializing module 'storage_sql' on 'szrengjing.com': /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:274: in function 'prosody.core.storagemanager.open' (...tail calls...) /usr/lib64/prosody/modules/mod_authz_internal.lua:26: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:66: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager error Failed to load storage driver plugin sql on szrengjing.com: /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:274: in function 'prosody.core.storagemanager.open' (...tail calls...) /usr/lib64/prosody/modules/mod_authz_internal.lua:26: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:66: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager warn Falling back to null driver for account_roles storage on szrengjing.com szrengjing.com:storage_sql error LuaDBI or LuaSQLite3 are required for using SQL databases but neither are installed szrengjing.com:storage_sql error Please install at least one of LuaDBI and LuaSQLite3. See https://prosody.im/doc/depends modulemanager error Error initializing module 'storage_sql' on 'szrengjing.com': /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:274: in function 'prosody.core.storagemanager.open' (...tail calls...) /usr/lib64/prosody/modules/mod_auth_internal_hashed.lua:23: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:95: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager error Failed to load storage driver plugin sql on szrengjing.com: /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:274: in function 'prosody.core.storagemanager.open' (...tail calls...) /usr/lib64/prosody/modules/mod_auth_internal_hashed.lua:23: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:95: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager warn Falling back to null driver for accounts storage on szrengjing.com szrengjing.com:storage_sql error LuaDBI or LuaSQLite3 are required for using SQL databases but neither are installed szrengjing.com:storage_sql error Please install at least one of LuaDBI and LuaSQLite3. See https://prosody.im/doc/depends modulemanager error Error initializing module 'storage_sql' on 'szrengjing.com': /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:232: in function </usr/lib64/prosody/core/storagemanager.lua:231> (...tail calls...) /usr/lib64/prosody/modules/mod_tokenauth.lua:9: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/moduleapi.lua:171: in function 'prosody.core.moduleapi.depends' /usr/lib64/prosody/modules/mod_auth_internal_hashed.lua:32: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:95: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager error Failed to load storage driver plugin sql on szrengjing.com: /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available stack traceback: [C]: in function 'error' /usr/lib64/prosody/modules/mod_storage_sql.lua:21: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/storagemanager.lua:86: in function 'prosody.core.storagemanager.load_driver' /usr/lib64/prosody/core/storagemanager.lua:111: in function 'prosody.core.storagemanager.get_driver' /usr/lib64/prosody/core/storagemanager.lua:232: in function </usr/lib64/prosody/core/storagemanager.lua:231> (...tail calls...) /usr/lib64/prosody/modules/mod_tokenauth.lua:9: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/moduleapi.lua:171: in function 'prosody.core.moduleapi.depends' /usr/lib64/prosody/modules/mod_auth_internal_hashed.lua:32: in main chunk [C]: in function 'prosody.util.xpcall.xpcall' /usr/lib64/prosody/core/modulemanager.lua:291: in upvalue 'do_load_module' /usr/lib64/prosody/core/modulemanager.lua:378: in function 'prosody.core.modulemanager.load' /usr/lib64/prosody/core/usermanager.lua:95: in function 'prosody.core.usermanager.initialize_host' /usr/lib64/prosody/util/prosodyctl.lua:86: in function 'prosody.util.prosodyctl.adduser' /bin/prosodyctl:593: in field '?' /bin/prosodyctl:745: in upvalue 'func' /usr/lib64/prosody/util/async.lua:149: in function </usr/lib64/prosody/util/async.lua:147> storagemanager warn Falling back to null driver for auth_tokens storage on szrengjing.com Error: No data storage active [root@yfw szrengjing.com]#
最新发布
11-13
你遇到的错误: ``` Error: No data storage active ``` 以及大量重复的日志: ``` szrengjing.com:storage_sql error LuaDBI or LuaSQLite3 are required for using SQL databases but neither are installed modulemanager error Error initializing module 'storage_sql' on 'szrengjing.com': /usr/lib64/prosody/modules/mod_storage_sql.lua:21: No SQL library available storagemanager warn Falling back to null driver for accounts storage on szrengjing.com ``` --- ## 🚨 核心问题解析 ### ❌ 错误原因: Prosody **无法找到任何可用的数据存储驱动**(SQL 或文件),导致: - 不能保存用户账号 - `prosodyctl register` 失败(提示 `No data storage active`) - 所有模块尝试加载 `sql` 存储失败后降级为 `null` 驱动(不持久化) 虽然你的 XMPP 服务可能仍能运行,但 **无法注册新用户、无法保存会话、无法持久化数据**。 --- ## ✅ 正确解决方案 你需要做两件事: ### ✅ 第一步:确认当前使用的存储方式 打开 Prosody 配置文件: ```bash sudo nano /etc/prosody/prosody.cfg.lua ``` 检查是否有如下配置: ```lua -- 域名配置块 VirtualHost "szrengjing.com" enabled = true -- 👇 确保存储类型是 internal 和 "flat" 文件存储(默认推荐) storage = "internal" -- 或者显式指定使用文件系统 -- storage = "filesystem" ``` > ⚠️ 如果你看到 `storage = "sql"` 或未设置却启用了数据库相关模块(如 `mod_auth_sql`),就会尝试加载 SQL 驱动 → 报错! --- ### ✅ 第二步:安装缺失的依赖(可选)或切换到文件存储 #### 方案 A ✅ 推荐:使用内置 `internal`/`filesystem` 存储(无需数据库) Prosody 默认支持将用户信息保存在磁盘文件中,不需要 LuaSQL。 确保以下配置存在: ```lua -- 全局设置 datastore_dir = "/var/lib/prosody" -- 确保该目录存在且可写 VirtualHost "szrengjing.com" enabled = true storage = "internal" -- 使用内建账户系统(基于文件) authentication = "internal_hashed" -- 密码哈希存储 ``` 然后创建并授权目录: ```bash sudo mkdir -p /var/lib/prosody/szrengjing.com sudo chown -R prosody:prosody /var/lib/prosody sudo chmod -R 750 /var/lib/prosody ``` 重启服务: ```bash sudo systemctl restart prosody ``` ✅ 再次尝试注册用户: ```bash sudo prosodyctl register user szrengjing.com password ``` 👉 应该成功!不会再报错。 --- #### 方案 B 🔧 如果你想用 SQLite(轻量级 SQL) 你可以安装 `luasql-sqlite3` 来启用 SQL 支持。 ##### 安装步骤(CentOS/Rocky Linux): ```bash # 安装 EPEL 源(如果还没装) sudo yum install epel-release -y # 安装 LuaSQL-SQLite3 sudo yum install luasql-sqlite3 -y ``` 或者使用 `luarocks` 安装: ```bash # 安装 luarocks(Lua 包管理器) sudo yum install luarocks -y sudo luarocks install luasql-sqlite3 ``` ##### 修改配置启用 SQLite: ```lua -- 在 /etc/prosody/prosody.cfg.lua 中添加 sql = { driver = "SQLite3", database = "/var/lib/prosody/prosody.sqlite" } VirtualHost "szrengjing.com" enabled = true storage = "sql" authentication = "sql" ``` 创建数据库目录权限: ```bash sudo touch /var/lib/prosody/prosody.sqlite sudo chown prosody:prosody /var/lib/prosody/prosody.sqlite sudo chmod 660 /var/lib/prosody/prosody.sqlite ``` 重启: ```bash sudo systemctl restart prosody ``` 再试注册命令即可。 --- ## ✅ 验证是否修复成功 ```bash sudo prosodyctl register testuser szrengjing.com hello123 ``` ✅ 成功表现:无报错输出,且能在 `/var/lib/prosody/szrengjing.com/accounts/` 下看到 `.dat` 文件(如果是 `internal` 存储): ```bash ls /var/lib/prosody/szrengjing.com/accounts/ # 输出应包含: testuser.dat ``` --- ## 🔍 日志说明解释 | 日志片段 | 含义 | |--------|------| | `LuaDBI or LuaSQLite3 are required...` | 你启用了 SQL 相关模块但没装库 | | `Falling back to null driver` | Prosody 降级使用“空”存储 → 数据不会保存 | | `Error: No data storage active` | 最终没有激活任何有效存储机制 | 📌 只要你不打算用 MySQL/PostgreSQL,就不要配置 `storage = "sql"`,否则必须安装对应 Lua 库。 --- ## ✅ 总结回答 你现在的问题是: > ❌ Prosody 尝试使用 SQL 存储,但缺少 `LuaSQLite3` 或 `LuaDBI` 库 > ❌ 同时又没有正确启用文件存储(`internal` / `filesystem`) > ➡️ 导致 `prosodyctl register` 失败:“No data storage active” ### ✅ 解决方案: ```lua -- 编辑配置文件 sudo nano /etc/prosody/prosody.cfg.lua ``` 改为使用文件存储: ```lua VirtualHost "szrengjing.com" enabled = true storage = "internal" authentication = "internal_hashed" -- 确保全局设置了路径 datastore_dir = "/var/lib/prosody" ``` 设置权限并重启: ```bash sudo chown -R prosody:prosody /var/lib/prosody sudo systemctl restart prosody ``` 再次注册用户: ```bash sudo prosodyctl register user szrengjing.com password ``` 🎯 成功! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值