【问题标题】:LOBase HSQL avoid having to put table and field names in quote marksLOBase HSQL 避免将表名和字段名放在引号中
【发布时间】:2021-12-25 10:26:53
【问题描述】:

将 LO Base 与本地 HSQL 数据库文件结合使用。

我想要做的:复制并粘贴我现有的(在某些情况下很长)查询,其形式如下:

SELECT table1.field1, table2.field2 FROM table1, table2 WHERE table1.id=table2.id

我要做什么:

SELECT "table1"."field1", "table2"."field2" FROM "table1", "table2" WHERE "table1"."id"="table2"."id"

然后我注意到,当我使用 LO Base 连接到远程 MySQL 数据库并运行查询时,它可以在没有引号的情况下正常工作,但是当数据源是本地 HSQL 数据库时会失败。有没有办法解决?我不想编辑一大堆复杂的查询......任何帮助表示赞赏

【问题讨论】:

  • 在 MySQL 和 HSQLDB 上实现互操作的一种方法是使用 ALTER TABLE ... RENAME 语句将表名和列名更改为全部大写。

标签: hsqldb libreoffice libreoffice-base


【解决方案1】:

除非表名和字段名是大写的,否则需要引号,如http://hsqldb.org/doc/2.0/guide/guide.html 所述:

标准 SQL 不区分大小写,除非对象名称用双引号括起来...所有未加引号的标识符都大写。

如果您不希望这样做,请将数据移动到本地 MySQL 实例,或任何其他区分大小写但不带引号的数据库。

或者,在运行查询之前编写正则表达式,在查询中添加引号。这可以在 LibreOffice Calc 中完成,将原始查询放在一列中,然后将 macro-based regular expression formula 放在添加引号的下一列中。

看起来这可能会变得复杂,所以我会用 Python 而不是 Basic 编写一个宏,因为有一个 regex library。这是一些示例代码。

import re

def quote_identifier(matchobj):
    if matchobj.group(0).upper() in ('SELECT','FROM','WHERE'):
        return matchobj.group(0)
    else:
        return '"{}"'.format(matchobj.group(0))

s = "SELECT table1.field1, table2.field2 FROM table1, table2 WHERE table1.id=table2.id"
result = re.sub("(\w+)", quote_identifier, s)
print(result)

这会打印引用的结果:

SELECT "table1"."field1", "table2"."field2" FROM "table1", "table2" WHERE "table1"."id"="table2"."id"

【讨论】:

  • 只是一个注释。我不确定,但 MySQL 中的大小写敏感性似乎取决于安装它的架构/操作系统。
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多