Подтвердить что ты не робот

ВЫБРАТЬ из ничего?

Возможно ли иметь оператор вроде

SELECT "Hello world"
WHERE 1 = 1

в SQL?

Главное, что я хочу знать, это я могу выбрать из ничего, т.е. не иметь предложение FROM.

4b9b3361

Ответ 1

Это не согласовано между поставщиками - поддержка Oracle, MySQL и DB2 двойственна:

SELECT 'Hello world'
  FROM DUAL

... в то время как SQL Server, PostgreSQL и SQLite не требуют FROM DUAL:

SELECT 'Hello world'

MySQL поддерживает оба способа.

Ответ 3

Попробуйте это.

Single:

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

Матричный:

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

подробнее здесь: http://modern-sql.com/use-case/select-without-from

Ответ 4

В типе SQL Server:

Select 'Your Text'

Нет необходимости в FROM или WHERE.

Ответ 5

Вы можете. Я использую следующие строки в Запрос проводника данных StackExchange:

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'

Ответ 6

Вот наиболее полный список поддержки базы данных dual из https://blog.jooq.org/tag/dual-table/:

Во многих других СУБД нет необходимости в фиктивных таблицах, так как вы можете выпускать такие утверждения:

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

Это СУБД, где, как правило, это возможно:

  • H2
  • MySQL
  • Энгр
  • Postgres
  • SQLite
  • SQL Server
  • Sybase ASE

В других СУБД требуются фиктивные таблицы, например, в Oracle. Следовательно, вам нужно написать такие вещи:

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

Это СУБД и их соответствующие фиктивные таблицы:

  • DB2: SYSIBM.DUAL
  • Derby: SYSIBM.SYSDUMMY1
  • H2: Опционально поддерживает DUAL
  • HSQLDB: INFORMATION_SCHEMA.SYSTEM_USERS
  • MySQL: необязательно поддерживает DUAL
  • Oracle: DUAL
  • Sybase SQL Anywhere: SYS.DUMMY

У Ingres нет DUAL, но на самом деле это нужно, как в Ingres, вы не можете иметь предложение WHERE, GROUP BY или HAVING без предложения FROM.

Ответ 7

В стандартном SQL, нет. Предложение WHERE подразумевает табличное выражение.

Из спецификации SQL-92:

7.6 "where clause"

Функция

Укажите таблицу, полученную применение "условия поиска" к результат предыдущего "из пункт".

В свою очередь:

7.4 "из предложения"

Функция

Укажите таблицу, полученную из одной или нескольких названных таблиц.

Стандартный способ сделать это (т.е. работать с любым продуктом SQL):

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

... если вы хотите изменить предложение WHERE на нечто более значимое, в противном случае его можно опустить.

Ответ 8

Я думаю, что это невозможно. Теоретически: select выполняет два вида вещей:

  • сузить/расширить набор (теория множеств);

  • отображение результата.

Первый можно рассматривать как горизонтальное уменьшение, противоположное предложению where-where, которое можно рассматривать как уменьшение по вертикали. С другой стороны, соединение может увеличивать набор по горизонтали, когда объединение может увеличивать набор по вертикали.

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

Второй - это отображение. Отображение - это скорее конвертер. В SQL он принимает несколько полей и возвращает ноль или более полей. В элементе select вы можете использовать некоторые агрегированные функции, такие как sum, avg и т.д. Или взять все значения столбца и преобразовать их в строку. В С# linq мы говорим, что select принимает объект типа T и возвращает объект типа U.

Я думаю, что путаница возникает из-за того, что вы можете сделать: select 'howdy' from <table_name>. Эта функция является отображением, частью конвертера выбора. Вы ничего не печатаете, а конвертируете! В вашем примере:

SELECT "
WHERE 1 = 1

вы не конвертируете ничего /null в "Hello world" и сужаете набор ничто/нет таблицы в одну строку, что imho не имеет никакого смысла.

Вы можете заметить, что если вы не ограничиваете количество столбцов, "Hello world" печатается для каждой доступной строки в таблице. Надеюсь, вы понимаете, почему к настоящему времени. Ваш выбор не принимает ничего из доступных столбцов и создает один столбец с текстом: "Hello world".

Итак, мой ответ НЕТ. Вы не можете просто отказаться от предложения from, потому что для выбора всегда требуются столбцы-столбцы.

Ответ 9

Для ClickHouse ничего нет system.one

SELECT 1 FROM system.one

Ответ 10

Существует и другая возможность - автономные VALUES():

VALUES ('Hello World');

Выход:

column1
Hello World

Это полезно, когда вам нужно указать несколько значений в компактном виде:

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

Выход:

column1     column2
      1     a
      2     b
      3     c

Демоверсия DBFiddle

Этот синтаксис поддерживается SQLite/PostgreSQL/DB LUW/MariaDB 10.3.

Ответ 11

Я знаю, что это старый вопрос, но лучшим решением для вашего вопроса является использование подмассива:

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

Таким образом, вы можете иметь WHERE и любое предложение (например, "Соединения" или "Применить" и т.д.) после оператора select, поскольку фиктивный подзапрос принудительно использует предложение FROM без изменения результата.

Ответ 12

Я использую firebird. Прежде всего, создайте одну таблицу столбцов с именем "NoTable", как это

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

теперь вы можете написать это

select 'hello world' as name

от известных

вы можете добавить любой столбец, который вы хотите показать

Ответ 13

В Firebird вы можете сделать это:

select "Hello world" from RDB$DATABASE;

RDB $ DATABASE - это специальная таблица, которая всегда имеет одну строку.

Ответ 14

Для DB2:

'VALUES('Hello world')'

Вы также можете сделать несколько "строк":

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

Вы даже можете использовать их в соединениях, если типы совпадают:

VALUES(1,'Hello world')
UNION ALL
VALUES(2,'Goodbye world');