MySQL/PostgreSQL/Oracle 固有のソリューションがあれば、それらすべてに興味があります。
6 に答える
DBMS に応じて、次の 1 つ以上が機能します。
SELECT NULL LIMIT 0
(PostgreSQL および MySQL の構文) /SELECT TOP 0 1
(MS SQL Server の構文)SELECT NULL WHERE FALSE
(PostgreSQL などのブール型の DBMS)SELECT NULL WHERE 1=0
(ほとんどの DBMS)
オラクルの場合、これらは の形式である必要があるとSELECT NULL FROM DUAL
私は信じています。/のどのバージョンが受け入れられるかわかりません。SELECT
FROM
LIMIT
TOP
WHERE
より複雑なオプションは、(一時) テーブルを作成し、そこに行を挿入しないことです。これにより、任意の数の列が得られ、値が含まれていなくても型が関連付けられます。
-- PostgreSQL
CREATE TEMP TABLE dummy ( a Int, b VarChar(42) );
SELECT * FROM dummy;
-- MS SQL Server
CREATE TABLE #DUMMY ( a Int, b VarChar(42) );
SELECT * FROM #DUMMY;
PostgreSQL では、列のないテーブルを作成することもできます。これにより、行と列がゼロの結果セットを作成できます。
CREATE TEMP TABLE empty ();
SELECT * FROM empty;
別の可能性として、DBMS にセットを返す関数がある場合、空のセットを返すことができる可能性があります。たとえば、私がよく知っている PostgreSQL では、次のように無効な範囲を指定できますgenerate_series()
。
SELECT * FROM generate_series(0,-1);
少なくとも MySQL/PostgreSQL では:
SELECT 1 LIMIT 0
常に不可能なことと同等の where 値。
Where 1 = 0
Where 'a' = 'b'
などなど
select *
from atable
where 1=2
さまざまな答えがあります:
SELECT 1 LIMIT 0
SELECT 1 FROM DUAL WHERE 1=0
ただし、行数が 0 であっても、列数は ではないことに注意してください。
例えば:
INSERT INTO t(a,b) SELECT 1 LIMIT 0;
!! Error: Column count doesn't match value count at row 1
あなたは書く必要があります:
INSERT INTO t(a,b) SELECT 1,1 LIMIT 0;
PostgreSQL では次のことができます。
select
*
from
table
join another_table on (false)
ブール式on()
が必要なため、これは機能します。結合すると、決してすることはできません。false
true