首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在sqlite中使用表达式作为表名

在sqlite中使用表达式作为表名
EN

Stack Overflow用户
提问于 2020-11-09 01:01:35
回答 1查看 58关注 0票数 0

在对某个表发送SELECT查询之前,我正在尝试检查该表是否存在。表名由尾随的2个字母的语言代码组成,当我获得包含用户语言的完整表名时,我不知道我的数据库是否真的支持该用户语言,以及该语言的表是否真的存在。

代码语言:javascript
运行
复制
SELECT name FROM sqlite_master WHERE name = 'mytable_zz' OR name = 'mytable_en' ORDER BY ( name = 'mytable_zz' ) DESC LIMIT 1;

然后

代码语言:javascript
运行
复制
SELECT * FROM table_name_returned_by_first_query;

我可以使用第一个查询来检查表是否存在,如果该表存在,则返回mytable_zz,如果不存在,则返回mytable_en,然后使用第一个查询的结果作为表名进行第二个查询。

但我宁愿在一个查询中完成所有操作,该查询将从用户的语言表或英语表返回预期的结果,以防用户的语言不受支持,而不会抛出“表mytable_zz不存在”错误。

有人知道我怎么处理这件事吗?有没有办法使用第一个查询的结果作为第二个查询中的表名?

编辑:我没有自动生成的数据库本身,我不想参与到手动更新任何新数据库的复杂过程中。此外,这个查询被多次调用,在启动第二个查询之前必须检索第一个查询的结果,这太长了。我使用通过SQLite包装器发送的纯文本查询。我想最简单的方法是在我的程序中一次性检查用户的语言是否受支持,并存储一个字符串,其中包含用户的语言代码,如果不受支持,则存储"en“,然后使用该字符串组成我的表名。除非有人有更好的主意,否则我会选择那个解决方案。

下面是一个简单的MRE:

代码语言:javascript
运行
复制
    CREATE TABLE IF NOT EXISTS `lng_en` ( key TEXT, value TEXT );
CREATE TABLE IF NOT EXISTS `lng_fr` ( key TEXT, value TEXT );
INSERT INTO `lng_en` ( key , value ) VALUES ( 'question1', 'What is your name ?');
INSERT INTO `lng_fr` ( key , value ) VALUES ( 'question1', 'Quel est votre nom ?');
SELECT `value` FROM lng_%s WHERE `key` = 'question1';

其中%s将替换为2个字母的语言代码。如果提供的代码是'en‘或'fr’,此示例将起作用,但如果代码是'zh',则会抛出错误,在这种情况下,我希望返回与'en‘相同的结果。

EN

回答 1

Stack Overflow用户

发布于 2020-11-09 01:18:46

不是在SQL中,而不是动态执行它。但是,如果这是您的前端运行此SQL,那么这并不重要。因为您的表名来自DB,所以没有任何机会使用它进行SQL注入攻击:

代码语言:javascript
运行
复制
var tabName = db.ExecuteScalar("SELECT name FROM sqlite_master WHERE name = 'mytable_zz' OR name = 'mytable_en' ORDER BY ( name = 'mytable_zz' ) DESC LIMIT 1;")

var results = db.ExecuteQuery("SELECT * FROM " + tabName);

Yunnosch的注释非常中肯;您实际上是在一个表名中存储信息,而这些信息实际上应该放在一个列中。您可以考虑创建一个表,然后创建一堆视图,如定义为SELECT * FROM mytable WHERE lang = 'zz'等的mytable_zz,如果您想要迎合无法更改的遗留应用程序,则可以使用instead-of触发器;遗留应用程序将从视图中进行选择/向视图中插入,认为它们是表,但实际上您的数据是单个表,更易于管理

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64740779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档