gpt4 book ai didi

java - SQL语句中如何判断列名是否必须用引号引起来?

转载 作者:行者123 更新时间:2023-11-29 12:05:34 26 4
gpt4 key购买 nike

我正在编写一个 Web 服务,它基本上允许用户针对广告列向各种 SQL 数据库中预先存在的表提交查询。

我有一个这样定义的 PostgreSQL 表:

CREATE TABLE stpg.test (
test integer,
"Test" integer,
"TEST" integer
);
insert into stpg.test values (1,2,3);

为了确定可用列的名称,我运行了以下 Java 代码:

ResultSet rs = dbmd.getColumns(null, "stpg", "test", null);
while (rs.next()) {
System.out.println(rs.getString("COLUMN_NAME"));
}

我得到:

testTestTEST

如果用户提交查询,引用返回的列,例如select test, Test, TEST from stpg.test 他将得到 1 1 1 而不是预期的 1 2 3。这是错误吗?

我知道执行 select test, "Test", "TEST"from stpg.test 会正确返回结果。但是我的用户不知道要获取在引号中定义的“大写”列的值,他们需要在查询中使用引号。

有没有一种方法可以确定列名称区分大小写,以便我可以在引号中报告它的名称?我通常需要针对不同的数据库执行此操作,因此 JDBC api 方法更可取。我尝试使用 ResultSetMetaData 并调用 getColumnNamegetColumnLabel 但它们返回的名称不带引号。调用 isCaseSensitive 始终返回 false。

最佳答案

Is there a way I could could determine that a column name is case sensitive so that I could report its name in quotes?

您似乎是在说,如果列名包含任何大写字母,则需要用引号将其引起来。在那种情况下:

    if (!name.equals(name.toLowercase())) {
// needs quoting.
}

但这没有实际意义:

  • 如果您只是引用所有列名,或者
  • 如果您对待用户提供的列名称不区分大小写。

(关于后一点,在列名称中区分大小写可能是一个糟糕的设计。区分大小写肯定不是您希望网站用户担心的事情.. .)


I tried using ResultSetMetaData and invoking getColumnName and getColumnLabel but they return the names without the quotes.

他们应该这样做!引号不是列名的一部分!它们是 (Postgres) SQL 标识符语法的一部分(通常)。名称是引号内的内容。

Calling isCaseSensitive always returns false.

老实说,并不完全清楚(来自 javadoc )该方法的结果意味着什么。但听起来您可能发现了正在使用的 JDBC 驱动程序中的错误。 (或者您可能只是弄错了。在当前 Postgres 中实现该方法的代码确实引用了列类型信息...)

关于java - SQL语句中如何判断列名是否必须用引号引起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21948619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com