2010-09-17 8 views
53

Czy to możliwe, aby mieć oświadczenie jakWYBIERZ Z niczego?

SELECT "Hello world" 
WHERE 1 = 1 

w SQL?

Najważniejsze, co chcę wiedzieć, to czy mogę wybrać z niczego, tj. Nie mieć klauzuli FROM.

+3

Patrząc na swoim komentarzu na @ Rafael Belliard, może lepiej byłoby zapytać, co naprawdę chcesz zrobić. Czy chcesz zwrócić ciąg znaków, jeśli na przykład istnieją wartości dla danej tabeli? –

+0

Tak, właściwie to właśnie chciałem. Wiem, że mogę to zrobić, zastanawiałem się bardziej, czy potrzebuję 'FROM NULL' między' SELECT' i 'WHERE'.Niewyraźne frazowanie głównie dlatego, że jest to praca domowa i nie chciałem, żeby ktoś przyszedł i powiedział mi odpowiedź, jeśli moje przeczucie było złe. –

Odpowiedz

4

Można. Używam następujące wiersze w 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 

dane Exchange wykorzystuje Transact-SQL (SQL Server własnych rozszerzeń do SQL).

Można spróbować samemu uruchamiając kwerendę jak:

SELECT 'Hello world' 
+0

Data Exchange jest Azure, oparta na SQL Server. –

+0

Serwer SQL używa [języka Transact-SQL] (http://en.wikipedia.org/wiki/Transact-SQL). – palswim

88

To nie jest spójne sprzedawców - Oracle, MySQL, DB2 i wsparcie podwójnej:

SELECT 'Hello world' 
    FROM DUAL 

... podczas SQL Server PostgreSQL, SQLite nie wymagają FROM DUAL:

SELECT 'Hello world' 

MySQL obsługuje zarówno sposoby.

+1

Zawsze się zastanawiałem. Dlaczego wybór terminu dual dla tabeli fantomów? –

+4

@Alex: "Oryginalna tabela DUAL miała dwa wiersze (stąd jej nazwa), ale później miała tylko jeden wiersz." – rebelliard

+2

W DB2 dual nazywa się "sysibm.sysdummy1" –

2

W standardowym SQL, nie. Klauzula WHERE implikuje wyrażenie tabeli.

Z SQL-92 specyfikacja:

7.6 "where clause"

Function

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

kolejno:

7.4 "from clause"

Function

Specify a table derived from one or more named tables.

standardowy sposób to robi (tzn powinien działać na każdym produkcie SQL):

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

... zakładając, że chcesz zmienić klauzulę WHERE na coś bardziej znaczącego, w przeciwnym razie można ją pominąć.

+0

BŁĄD: kolumna "hello world" nie istnieje w my_table Zapytanie nie powiodło się PostgreSQL powiedział: kolumna "hello world" nie istnieje w my_table –

+0

@ PålBrattberg: powinny być pojedyncze cytaty, teraz poprawione. – onedaywhen

+0

Tak, działa z pojedynczymi cudzysłowami –

6

W SQL Server Typ:

Select 'Your Text' 

Nie ma potrzeby stosowania klauzuli FROM lub WHERE.

+0

Dlaczego nie używasz bloku kodu do lepszego wyświetlania kodów? –

1

Myślę, że to niemożliwe. Teoretycznie: select wykonuje dwa rodzaje rzeczy:

  • zawęzić/poszerzyć zestaw (ustawiona teoria);

  • mapowanie wyniku.

Pierwszy z nich można postrzegać jako poziomą redukcję przeciwstawiającą się klauzuli where, która może być postrzegana jako pionowa redukcja. Z drugiej strony łączenie może zwiększyć zestaw w poziomie, w którym łącznik może zwiększyć zestaw w pionie.

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

Drugi to mapowanie. Mapowanie jest bardziej konwerterem. W SQL zajmuje kilka pól i zwraca zero lub więcej pól. W selekcji możesz użyć niektórych funkcji agregujących, takich jak suma, śr. Itd. Albo weź wszystkie wartości kolumn i przekonwertuj je na ciąg. W C# linq mówimy, że select akceptuje obiekt typu T i zwraca obiekt typu U.

Myślę, że zamieszanie wynika z faktu, że możesz zrobić: select 'howdy' from <table_name>. Ta funkcja jest mapowaniem, częścią konwertera wyboru. Nie drukujesz czegoś, ale konwertujesz! W przykładzie:

SELECT " 
WHERE 1 = 1 

konwertowania nic/null do "Hello world" i zawężenie zestawu nic/nie stole w jednym rzędzie, która imho nie ma sensu w ogóle.

Możesz zauważyć, że jeśli nie ograniczysz liczby kolumn, zostanie wydrukowany "Hello world" dla każdego dostępnego wiersza w tabeli. Mam nadzieję, że teraz rozumiesz dlaczego. Twój wybór nie bierze nic z dostępnych kolumn i tworzy jedną kolumnę z tekstem: "Hello world".

Tak, moja odpowiedź brzmi NIE. Nie można po prostu pominąć klauzuli "od", ponieważ wybór zawsze wymaga kolumn tabeli do wykonania.

-1

wiem, jest to stara sprawa, ale najlepiej obejście za pytanie używa obojętne podzapytania:

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

W ten sposób można mieć żadnych zastrzeżeń, gdzie i jak przyłącza (lub Zastosuj, itd.) Po instrukcja select, ponieważ metoda podrzędnego zapytania wymusza użycie klauzuli FROM bez zmiany wyniku.

+0

Nadal masz 'SELECT' bez' FROM' w swoim podkwerendzie, więc nadal będzie zawiedzać Oracle, itp. – Pere

+0

W Oracle jest jeszcze prostsze, ponieważ możesz po prostu "WYBIERZ" Hello 'FROM dual WHERE 1 = 1' i pomiń podzapytanie. – DomingoR

+0

OP zapytał, czy możliwe było posiadanie instrukcji (a mianowicie 'SELECT') bez klauzuli" FROM ". Nie czytałeś tego pytania? – Pere

0

Używam firebird Przede wszystkim, należy utworzyć tabelę jedna kolumna o nazwie "notable" jak to

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

teraz można napisać ten

select 'hello world' as name 

z zauważalną

możesz dodać dowolną kolumnę, którą chcesz pokazać:

-1

Myślę, że dlatego, że jesteś już wybierając wartość, to nie potrzebujemy „z” klauzuli i wyjmuje wartość