Hiçbir şeyden seçilsin mi?


91

Gibi bir ifadeye sahip olmak mümkün mü

SELECT "Hello world"
WHERE 1 = 1

SQL'de?

Bilmek istediğim en önemli şey, hiçbir şeyden SEÇEBİLİR miyim, yani bir FROM tümcesine sahip olamaz mıyım?


3
@Rafael Belliard hakkındaki yorumunuza bakarak, gerçekte ne yapmak istediğinizi sormanız daha iyi olabilir. Örneğin, belirli bir tablo için değerler mevcutsa, bazı dizeler döndürmek ister misiniz?
Jim L

Evet, aslında tam da istediğim buydu. Ben bunu yapabilirim, biliyorum, ben gerekirse merak fazla oldu FROM NULLarasındaki SELECTve WHERE. Belirsiz ifadeler çoğunlukla ödev olduğu için ve içgüdülerim yanlışsa birinin gelip bana cevabı söylemesini istemediğim için.
Ritwik Bose

Yanıtlar:


141

Satıcılar arasında tutarlı değildir - Oracle, MySQL ve DB2, ikiliyi destekler:

SELECT 'Hello world'
  FROM DUAL

... SQL Server, PostgreSQL ve SQLite FROM DUALşunları gerektirmez :

SELECT 'Hello world'

MySQL her iki yolu da destekler.


2
Hep merak etmişimdir. Hayalet tablo için neden dual terimi seçilmeli?
Alex Blakemore

5
@Alex: "Orijinal DUAL tablonun içinde iki satır vardı (dolayısıyla adı), ancak daha sonra yalnızca bir satırı vardı."
isyan

7
DB2'de dual 'sysibm.sysdummy1' olarak adlandırılır
Danubian Sailor

1
Postgresql'de, DUALhayalet benzeri bir tablodan adında kukla bir tablo oluşturmak ve sorgular gerçekleştirmek mümkündür .
Stephan

1
@AlexBlakemore "DUAL tabloyu Oracle Veri Sözlüğünde temel bir nesne olarak oluşturdum. Asla kendisinin görülmesi amaçlanmadı, bunun yerine sorgulanması beklenen bir görünümde kullanıldı. Fikir, bir JOIN yapabilmekti DUAL tabloyu seçin ve tablonuzdaki her bir satır için sonuçta iki satır oluşturun. Ardından, GROUP BY kullanılarak, elde edilen birleştirme DATA kapsamı ve INDEX kapsamları için depolama miktarını göstermek üzere özetlenebilir. DUAL adı, tek bir satırdan bir çift satır oluşturma işlemi için uygun görünüyordu "( en.wikipedia.org/wiki/DUAL_table )
Tamam'ı tıklayın


15

Bunu dene.

Tek:

SELECT *  FROM (VALUES ('Hello world')) t1 (col1) WHERE 1 = 1

Çok:

SELECT *  FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1

daha fazla ayrıntı burada: http://modern-sql.com/use-case/select-without-from


1
ANSI SQL uyumlu tek cevap! (
DBM

Amacı nedir WHERE 1 = 1? PostgreSQL'de onsuz çalışır. Veya başka bir DMBS ile mi ilgili?
Frankie Drake

Sadece SELECT * FROM (VALUES ("Hello world")) t1 (col1)hala ince. Wheresadece bu soruya cevap ver.
chuongtv

@chuongtv Birden çok satırı nasıl seçersiniz?
Hector

@Hector SQL'in struct eklentisini takip edin. bunun gibiSELECT * FROM (VALUES ('Hello world'),('Hello world'),('Hello world')) t1 (col1) WHERE 1 = 1
chuongtv

8

İkili veritabanı desteğinin en eksiksiz listesi https://blog.jooq.org/tag/dual-table/ adresinde :

Diğer birçok RDBMS'de, aşağıdaki gibi ifadeler yayınlayabileceğiniz için kukla tablolara gerek yoktur:

SELECT 1;
SELECT 1 + 1;
SELECT SQRT(2);

Bunlar, yukarıdakilerin genellikle mümkün olduğu RDBMS'dir:

  • H2
  • MySQL
  • Ingres
  • Postgres
  • SQLite
  • SQL Server
  • Sybase ASE

Diğer RDBMS'de, Oracle'da olduğu gibi sahte tablolar gereklidir. Bu nedenle, aşağıdakiler gibi şeyler yazmanız gerekecek:

SELECT 1       FROM DUAL;
SELECT 1 + 1   FROM DUAL;
SELECT SQRT(2) FROM DUAL;

Bunlar RDBMS ve bunların ilgili sahte tablolarıdır:

  • DB2: SYSIBM.DUAL
  • Derbi: SYSIBM.SYSDUMMY1
  • H2: İsteğe bağlı olarak DUAL'i destekler
  • HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
  • MySQL: İsteğe bağlı olarak DUAL'i destekler
  • Oracle: ÇİFT
  • Sybase SQL Anywhere: SYS.DUMMY

Ingres'te DUAL yoktur, ancak aslında Ingres'de olduğu gibi buna ihtiyaç duyacaktır, bir FROM yan tümcesi olmadan bir WHERE, GROUP BY veya HAVING yan tümcesine sahip olamazsınız.


6

SQL Server türünde:

Select 'Your Text'

FROMVeya WHEREmaddesine gerek yoktur .


5

Yapabilirsin. Bir StackExchange Veri Gezgini sorgusunda aşağıdaki satırları kullanıyorum :

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

Veri Değişimi, Transact-SQL'i (SQL Server'a özel SQL uzantıları) kullanır.

Aşağıdaki gibi bir sorgu çalıştırarak kendiniz deneyebilirsiniz:

SELECT 'Hello world'

Veri Değişimi, SQL Server tabanlı Azure'dur.
OMG Ponies

2

Bunun mümkün olmadığını düşünüyorum. Teorik olarak: select iki tür şey gerçekleştirir:

  • seti daraltır / genişletir (küme teorisi);

  • sonucun eşleştirilmesi.

Birincisi, dikey bir azalma olarak görülebilen where-cümlesinin aksine yatay bir azalma olarak görülebilir. Öte yandan, bir birleşim, kümeyi yatay olarak artırabilir, burada bir birleşim kümeyi dikey olarak büyütebilir.

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

İkincisi bir haritalamadır. Bir eşleme, daha çok bir dönüştürücüdür. SQL'de bazı alanları alır ve sıfır veya daha fazla alan döndürür. Seçimde, sum, avg vb. Gibi bazı toplama işlevlerini kullanabilirsiniz. Veya tüm sütun değerlerini alıp dizgeye dönüştürün. C # linq'de, bir select'in T tipi bir nesneyi kabul ettiğini ve U tipi bir nesne döndürdüğünü söylüyoruz.

Ben karışıklık Yapabileceğiniz gerçeğiyle gelir düşünüyorum: select 'howdy' from <table_name>. Bu özellik, seçimin dönüştürücü kısmı olan eşlemedir. Bir şey yazdırmıyorsun, dönüştürüyorsun! Örneğinizde:

SELECT "
WHERE 1 = 1

hiçbir şeyi / null "Hello world"değerini dönüştürüyorsunuz ve hiçbir şey / tablo yok kümesini tek bir satıra daraltıyorsunuz ki bu hiç mantıklı değil.

Sütun sayısını sınırlamazsanız "Hello world", tablodaki mevcut her satır için yazdırıldığını fark edebilirsiniz . Umarım nedenini şimdiye kadar anlıyorsundur. Sizin seçkin mevcut kolonların hiçbir şey alır ve metin ile bir sütun oluşturur: "Hello world".

Yani cevabım HAYIR. From-cümlesini dışarıda bırakamazsınız çünkü seçim her zaman için tablo sütunlarına ihtiyaç duyar.


2

Standart SQL'de hayır. Bir WHEREyan tümce, bir tablo ifadesini ifade eder.

SQL-92 spesifikasyonundan:

7.6 "nerede maddesi"

Fonksiyon

Önceki "from cümlesi" nin sonucuna bir "arama koşulu" uygulanarak türetilen bir tablo belirtin.

Sırayla:

7.4 "maddeden"

Fonksiyon

Bir veya daha fazla adlandırılmış tablodan türetilmiş bir tablo belirtin.

Bunu yapmanın standart bir yolu (yani herhangi bir SQL ürünü üzerinde çalışmalıdır):

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

... WHEREcümleyi daha anlamlı bir şeye değiştirmek istediğinizi varsayarsak , aksi takdirde atlanabilir.


HATA: "merhaba dünya" sütunu my_table'da mevcut değil Sorgu başarısız oldu PostgreSQL şunu söyledi: "merhaba dünya" sütunu my_table'da mevcut değil
Pål

@ PålBrattberg: tek tırnak olmalı, şimdi düzeltildi.
2016

İşlem süresi açısından hangi tablonun kullanıldığı önemli mi? Veya SELECT'in herhangi bir sütuna referans vermemesi gerçek tabloyu alakasız kılıyor mu?
Allen Gould

@AllenGould: 'satıcıya bağlı' olacaktır, ancak kötüye kullanılabilecek açık kısa devreler vardır, örneğin, optimize edicinin SELECTcümlenin yalnızca sabitlerden oluştuğunu fark ettiği ve bu AnyTableWithOneOrMoreRowsdepolanmış bir tablodur, bu nedenle yalnızca tablonun sahip olup olmadığını doğrulamak için istatistikleri kullanır. sıfır satır.
onedaywhen

2

Başka bir olasılık daha var - bağımsız VALUES():

VALUES ('Hello World');

Çıktı:

column1
Hello World

Birden çok değeri kompakt bir şekilde belirtmeniz gerektiğinde kullanışlıdır:

VALUES (1, 'a'), (2, 'b'), (3, 'c');

Çıktı:

column1     column2
      1     a
      2     b
      3     c

DBFiddle Demo

Bu sözdizimi SQLite / PostgreSQL / DB LUW / MariaDB 10.3 tarafından desteklenmektedir.


2

ClickHouse için hiçbir şey system.one

SELECT 1 FROM system.one

1

Firebird'de bunu yapabilirsiniz:

select "Hello world" from RDB$DATABASE;

RDB $ DATABASE, her zaman bir satır içeren özel bir tablodur.


0

Bunun eski bir soru olduğunu biliyorum, ancak sorunuz için en iyi çözüm, sahte bir alt sorgu kullanmaktır:

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

Bu şekilde, kukla alt sorgu sonucu değiştirmeden FROM yan tümcesini kullanmaya zorladığından, select ifadesinden sonra WHERE ve herhangi bir cümle (Joins veya Apply, vb.) Olabilir.


1
Hala var SELECTbir olmadan FROMhala vb Oracle, başarısız olur, böylece alt sorguda
Pere

Oracle'da daha da basittir çünkü SELECT 'Hello' FROM dual WHERE 1=1alt sorguyu atlayabilir ve atlayabilirsiniz.
DomingoR

OP, cümlecik SELECTolmadan bir ifade (yani, a ) almanın mümkün olup olmadığını sordu FROM. Soruyu okumadın mı
Pere

Soruyu okudum ama SQL konusunda tamamen deneyimsiz değilseniz (veya diğer cevapları okumadıysanız), WHEREonsuz olamayacağınızı biliyorsunuz FROM. Buna göre, OP sorusunun ilk ifadesine cevap verdim.
DomingoR

Pekala, SQL'de 15 yıldan fazla deneyime sahibim, bir Hesaplama Derecesi ve şimdi bir WHEREstandart SQL'e sahip olup olmadığını hatırlamadım . Diğer cevapları da okudum. Bu arada, doğru olan şey, "a olmadan " (?) Değil, a SELECTolmadan sahipFROM olamayacağınızdır . Sorgunuz nerede çalışıyor, @DomingoR? Hala bir (alt sorguda) vardır, bu nedenle , a olmadan sorgulara izin vermeyen ve yalnızca standart SQL'den sapanlar üzerinde çalışan ve . Yani cevabınız hiçbir işe yaramıyor. WHEREFROMSELECTFROMFROMFROMSELECT
Pere

0

Firebird kullanıyorum Öncelikle bunun gibi "NoTable" adında bir sütun tablosu oluşturun

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

şimdi bunu yazabilirsin

select 'hello world' as name

dikkate değer

gösterilmesini istediğiniz herhangi bir sütunu ekleyebilirsiniz


0

DB2 için:

`VALUES('Hello world')`

Birden çok "satır" da yapabilirsiniz:

`VALUES('Hello world'),('Goodbye world');`

Türler eşleştiği sürece bunları birleştirmelerde bile kullanabilirsiniz:

VALUES(1,'Hello world')
UNION ALL
VALUES(2,'Goodbye world');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.