如何在子查询中使用查询表名

问题描述

我正在尝试使用单个查询在相应的表中查询字段名称及其最大长度 - 是否可能?我已经阅读了相关子查询,但我无法得到想要的结果。

这是我目前的查询

select T1.RDB$FIELD_NAME,T2.RDB$FIELD_NAME,T2.RDB$RELATION_NAME as tabName,T1.RDB$CHaraCTER_SET_ID,T1.RDB$FIELD_LENGTH,(select max(char_length(T2.RDB$FIELD_NAME)) 
     FROM tabName as MaxLength)
from RDB$FIELDS T1,RDB$RELATION_FIELDS T2

以上不起作用,因为,当然,这里子查询试图找到“tabName”表。我的猜测是我应该使用某种连接,但我的 sql 技能在这方面非常有限。

请求的起源是我想应用 this script 以便将我所有的非 utf8 字段转换为 UTF8 但我遇到了“字符串截断”问题,因为我有一些 `VARCHAR(8192 )' 字段会导致脚本出现字符串截断错误。通常,没有一个字段会实际使用这些 8192 个字符,但我宁愿在截断之前确定。

解决方法

您尝试做的事情无法通过这种方式完成。看起来你想获取表中字段的实际最大长度,但是你不能像这样动态引用表名和列名;能够做到这一点将是 SQL 注入的天堂。此外,您使用 SQL-89 交叉连接而不是内部连接(最好是 SQL-92 样式)会导致其他问题,因为您将错误地组合字段(作为笛卡尔积)。

相反,您需要编写 PSQL 来动态构建和执行语句以获取长度(使用 EXECUTE BLOCK(或存储过程)和 EXECUTE STATEMENT)。

例如,像这样:

    ngOnInit(): void {
    this.socialAuthService.authState.subscribe((user) => {
      this.user = user;
      localStorage.setItem('googleUserName',JSON.stringify(this.user?.name));
      this.myStore = localStorage.getItem('googleUserName')
    })
    
    if(localStorage.getItem('googleUserName')) {
        this.myStore = localStorage.getItem('googleUserName')
        this.newUser = JSON.parse(this.myStore);
        this.user = {
          "name": this.newUser
        }
    }
  }

   // google signout
  signOutWithGoogle() {
    localStorage.clear()
    this.socialAuthService.signOut()
  }

顺便说一句,UTF8 字符集的 VARCHAR 的最大长度是 8191,而不是 8192。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...