解释SQL的BNF

时间:2010-10-26 19:02:46

标签: sql syntax bnf

我正在研究SQL的语法,特别是character string literal

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

忽略[ <introducer> <character set specification> ]部分,是否意味着由<quote> [ <character representation> ... ] <quote>分隔的一个或多个<separator>

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

对于查询SELECT 'hello' 'world',Microsoft SQL Server 2005返回:

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

和MySQL 5.0返回:

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

我知道SQL的每种风格都不同,并且它们并非都符合标准。我只是想确定我是否正确地解释了BNF。感谢。

3 个答案:

答案 0 :(得分:2)

  

如果是这样,那是否意味着'hello''world'应该被解析为一个?

根据ANSI SQL,是的。

答案 1 :(得分:0)

为了澄清SQL Server中发生的事情,您实际做的是返回“hello”,列名为“world”。您的示例与:

相同
SELECT 'hello' AS 'world'

如果您试图进一步扩展您的想法,则会收到错误:

SELECT 'hello' 'world' 'now'

Line 1: Incorrect syntax near 'now'.

答案 2 :(得分:0)

查看BNF <separator> ::=