2010-09-17 56 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

我認爲,因爲你已經選擇的價值,它不「從」條款需要,拿出價值