【发布时间】:2014-04-09 17:20:23
【问题描述】:
我正在用 JAVA 编写一个演示代码 sn-p,数据库值为 NULL。
我在其中使用NULL 编写了一些简单的表达式,并为这些表达式提供了别名。但没有AS 关键字。我很清楚它是可选的。
当我在MySQL 命令行运行 SQL 查询并使用JAVA 时,结果是相同的。
但奇怪的是,(尽管可能不适合你们中的某些人),我发现在其中一个表达式上它没有使用定义的别名,而是使用了整个表达式以及表达式名称,并带有空格字符在他们之间。该空格是 sql 语句中表达式和别名之间的分隔符。
当我在同一个表达式上显式使用 AS 关键字时,结果符合预期。
使用的 SQL 语句:
select
length( null ) null_len -- to check if null data has any length
, length( '' ) empty_len -- to check length of an empty string
, null = '' 'n=e?' -- to check if null is equal to an empty string
, null = '' "n=e?" -- same as above but alias name within dbl quotes
, null = '' as 'n=e??' -- same with AS keyword on alias name used
, '' is null 'e=n?' -- to check if empty is equal to null
from dual;
MySQL 命令行控制台上的结果:
+----------+-----------+------------------+------------------+-------+------+
| null_len | empty_len | null = '' 'n=e?' | null = '' "n=e?" | n=e?? | e=n? |
+----------+-----------+------------------+------------------+-------+------+
| NULL | 0 | NULL | NULL | NULL | 0 |
+----------+-----------+------------------+------------------+-------+------+
使用 Java 和 ResultSetMetaData 的结果:
for( int i=1; i <= numberOfColumns; i++ ) {
String columnLabel = rsmd.getColumnLabel( i );
String columnName = rsmd.getColumnLabel( i );
//String columnType = rsmd.getColumnTypeName( i );
//String columnClassName = rsmd.getColumnClassName( i );
System.out.println( "Column Label: " + columnLabel );
System.out.println( "Column Name : " + columnLabel );
//System.out.println( "Column Type : " + columnType );
//System.out.println( "Column Class: " + columnClassName );
System.out.println();
} // for count of columns
输出:
Column Label: null_len
Column Name : null_len
Column Label: empty_len
Column Name : empty_len
Column Label: null='' 'n=e?'
Column Name : null='' 'n=e?'
Column Label: null='' "n=e?"
Column Name : null='' "n=e?"
Column Label: n=e??
Column Name : n=e??
Column Label: e=n?
Column Name : e=n?
问题(可能不是!)
为什么没有AS 关键字就不能识别别名名称?
这是一个已知的事实和问题吗?
注意:我用过JAVA,只是为了测试和演示问题。问题不在于 JAVA 的行为。因此,答案不必是JAVA 特定的。
【问题讨论】: