2010-10-26 192 views
3

我正在查看SQL的语法,特别是character string literal解释SQL的BNF

<character string literal> ::= 
    [ <introducer> <character set specification> ] 
    <quote> [ <character representation> ... ] <quote> 
    [ { <separator> <quote> [ <character representation> ... ] <quote> }... ] 

忽略[ <introducer> <character set specification> ]一部分,这意味着一个或多个由一个<separator>分离<quote> [ <character representation> ... ] <quote> S'

如果是这样,是否意味着'hello' 'world'应该被解析为一个<character string literal>

对于查询SELECT 'hello' 'world',微软SQL Server 2005倍中的回报:

+-------+ 
| world | 
+-------+ 
| hello | 
+-------+ 

和MySQL 5.0返回:

+------------+ 
| hello  | 
+------------+ 
| helloworld | 
+------------+ 

据我所知,SQL的每一种滋味是不同的,他们不全部遵循标准。我只是想确定我是否正确解释BNF。谢谢。

+0

一个小布局点:SQL服务器返回列标题世界的值“hello”。 “世界”被解释为别名/标识符。好的问题... – gbn 2010-10-26 19:10:43

回答

2

If so, does that mean that 'hello' 'world' should be parsed as one ?

根据ANSI SQL,是的。

0

为了阐明SQL Server中正在发生的事情,您实际上正在做的是使用'world'列名称返回'hello'。你举的例子是一样的:

SELECT 'hello' AS 'world' 

如果您想进一步扩展你的思想,你会得到一个错误:

SELECT 'hello' 'world' 'now' 

Line 1: Incorrect syntax near 'now'. 
+0

谢谢,我从一开始就明白这一点。我的主要问题是关于BNF。 – jordanbtucker 2010-10-26 19:10:54

0

看那BNF为<separator> ::=

+0

然后呢?我看不出这有什么帮助。 – gbn 2010-10-26 19:15:17

+0

我将其解释为一个或多个 s。 – jordanbtucker 2010-10-26 19:19:42