2010-09-17 59 views
53

是否有可能有一个像从空中选择?

SELECT "Hello world" 
WHERE 1 = 1 

在SQL声明?

我想知道的主要事情是我可以从无选择,即没有FROM子句。

+3

上@看着您的评论拉斐尔贝利亚德,你最好问你实际上想做什么。例如,如果给定表的值存在,是否要返回一些字符串? – 2010-09-17 03:15:00

+0

是的,那实际上正是我想要的。我知道我可以做到这一点,我更想知道在“SELECT”和“WHERE”之间是否需要“FROM NULL”。模糊的措辞主要是因为它的功课,我不想让别人来告诉我答案,如果我的直觉感觉错了。 – 2010-09-17 03:16:56

回答

19

Oracle

SELECT 'Hello world' FROM dual 

Dual equivalent in SQL Server

SELECT 'Hello world' 
+0

我可以在它后面放置一个像WHERE(SELECT ...)这样的语句吗? – 2010-09-17 03:12:18

+0

+1。我也不知道。 :) – sheeks06 2010-09-17 03:18:03

4

可以。我使用的StackExchange Data Explorer query下面几行:

SELECT 
(SELECT COUNT(*) FROM VotesOnPosts WHERE VoteTypeName = 'UpMod' AND UserId = @UserID AND PostTypeId = 2) AS TotalUpVotes, 
(SELECT COUNT(*) FROM Answers WHERE UserId = @UserID) AS TotalAnswers 

数据交换使用的Transact-SQL(在SQL Server专有扩展到SQL)。

您可以通过运行一个查询喜欢自己尝试一下:

SELECT 'Hello world' 
+0

数据交换是基于SQL Server的Azure。 – 2010-09-17 03:18:36

+0

而SQL Server使用[Transact-SQL](http://en.wikipedia.org/wiki/Transact-SQL)。 – palswim 2010-09-17 19:45:53

88

这是不同厂商并不一致 - 甲骨文,MySQL和DB2支持双:

SELECT 'Hello world' 
    FROM DUAL 

...在SQL Server ,PostgreSQL和SQLite不要求:FROM DUAL

SELECT 'Hello world' 

MySQL确实支持方法。

+1

我一直在想。为什么幻影表的选项是双重的? – 2010-09-17 03:27:34

+4

@Alex:“原来的DUAL表有两行(因此它的名字),但随后它只有一行。” – rebelliard 2010-09-17 03:35:14

+2

在DB2上,dual被称为'sysibm.sysdummy1' – 2013-09-12 09:10:39

2

在Standard SQL中,no。 A WHERE子句暗示了一个表格表达式。

从SQL-92规格:

7.6 "where clause"

Function

Specify a table derived by the application of a "search condition" to the result of the preceding "from clause".

依次为:

7.4 "from clause"

Function

Specify a table derived from one or more named tables.

做它的标准方式(即应该在任何SQL产品工作):

SELECT DISTINCT 'Hello world' AS new_value 
    FROM AnyTableWithOneOrMoreRows 
WHERE 1 = 1; 

...假设您想要将WHERE子句更改为更有意义的内容,否则可以省略。

+0

错误:my_table中不存在列“hello world”列 查询失败 PostgreSQL表示:my_table中不存在列“hello world” – 2016-05-12 08:19:58

+0

@PålBrattberg:应该是单引号,现在已修复。 – onedaywhen 2016-05-12 09:27:45

+0

是的,使用单引号 – 2016-05-12 15:33:52

6

在SQL Server类型:

Select 'Your Text' 

没有必要为FROMWHERE条款。

+0

为什么不使用代码块来更好地显示代码? – 2012-11-27 17:33:09

1

我认为这是不可能的。理论上讲:选择执行两种东西:

  • 缩小/扩大set(set-theory);

  • 映射结果。

第一个可以看作是一个横向递减,与where子句相反,它可以被看作是一个垂直递减。另一方面,联合可以水平增加集合,联合可以垂直增加集合。

   augmentation   diminishing 
horizontal  join/select    select 
vertical   union   where/inner-join 

第二个是映射。映射,更多的是一个转换器。在SQL中它需要一些字段并返回零个或多个字段。在select中,可以使用一些集合函数,如sum,avg等。或者将所有列值转换为字符串。在C#linq中,我们说一个select接受一个T类型的对象并返回一个U类型的对象。

我认为混淆的原因可以是:select 'howdy' from <table_name>。该功能是映射,转换器的一部分。你不打印东西,但转换!在您的例子:

SELECT " 
WHERE 1 = 1 

要转换什么/空到"Hello world"你缩小集没什么/没有表成一排,其中,恕我直言,没有任何意义可言。

您可能会注意到,如果不限制列的数量,则会为表中的每个可用行打印"Hello world"。我希望,你明白为什么现在。您的选择不会从可用列中获取任何内容,并使用文本创建一列:"Hello world"

所以,我的答案是否定的。您不能仅仅忽略from子句,因为select始终需要表列来执行。

-1

我知道这是一个老问题,但你的问题的最佳解决方法是使用虚拟子查询:

SELECT 'Hello World' 
FROM (SELECT name='Nothing') n 
WHERE 1=1 

这样你可以有WHERE和任何条款(比如连接或应用等)后,自从虚拟子查询以来的select语句强制使用FROM子句而不更改结果。

+0

在你的子查询中你仍然有一个没有'FROM'的SELECT,所以它在Oracle中仍然会失败,等等。 – Pere 2017-11-13 11:50:54

+0

在Oracle中更简单,因为你可以'SELECT'Hello'FROM dual WHERE 1 = 1'和跳过子查询。 – DomingoR 2017-11-15 12:58:26

+0

OP询问是否可以有一个没有'FROM'子句的语句(即'SELECT')。你没有读过这个问题吗? – Pere 2017-11-15 14:24:29

0

我用火鸟 首先,创建一个名为 “显着” 像这样

CREATE TABLE NOTABLE 
(
    NOCOLUMN    INTEGER 
); 
INSERT INTO NOTABLE VALUES (0); -- You can put any value 

一列的表,现在你可以这样写

select 'hello world' as name 
从著名

你可以添加任何你想要显示的列

-1

我认为,因为你已经选择的价值,它不“从”条款需要,拿出价值