Инструменты пользователя

Инструменты сайта


select



SELECT

Версии сервера

0.9 1.0 1.5.3 1.5.4 1.5.5 2.0 2.0.3 2.0.4 2.1 2.5 3.0
Да Да Да Да Да Да Да Да Да Да Да

:!: Внимание! Почти с каждым новым релизом сервера Firebird в оператор SELECT добавлялась новая возможность или параметр. В связи с этим, смотрите версию сервера напротив описания каждого параметра оператора.

Формат

<select statement> ::= 
  <select expression> [FOR UPDATE] [WITH LOCK]

<select_expression> ::= 
  <select_expr_body>
  [ ORDER BY <sort_value_list> ]
  [ ROWS     <record_number> [TO <record_number>] ]

<select_expr_body> ::=
  { <query_specification> | <select_expr_body> UNION [DISTINCT | ALL] <query_specification> }

<query_specification> ::=
  SELECT 
    [DISTINCT | ALL] 
    [FIRST {<record_number> | (:param_recordnumber) } [SKIP <record_number> | (:param_recordnumber) ] ] 
    <select_list>
  FROM     <reference_expression_list>
  [ WHERE    <search condition>   ]
  [ GROUP BY <group_value_list>   ]
  [ HAVING   <group_condition>    ]
  [ PLAN     <plan_item_list>     ]

<select_list> ::=
  {  <constant> 
   | <column_name>[<array_dim>]
   | <expression>
   | <function> ([<select_list>])
   | <UDF> ([<select_list>])
   | NULL
   | {CURRENT_USER | CURRENT_ROLE | CURRENT_TIMESTAMP | CURRENT_CONNECTION | CURRENT_XXX }
   | RDB$DB_KEY
  } [COLLATE <collate>] [AS <column_alias_name>]

<reference_expression_list> ::= 
  {<table name> | <view name> | <procedure name> | <joined table> | <derived table> }

<derived table> ::= 
  '(' <select expression> ')'

<joined table> ::= 
  { <cross_join> | <qualified_join> }

<cross_join> ::= 
  <reference_expression_list> CROSS JOIN <reference_expression_list>

<qualified_join> ::=
  <reference_expression_list> [{INNER | {LEFT | RIGHT | FULL} [OUTER]}] JOIN <reference_expression_list> ON <join condition>

<search_condition> ::=
    <val> <operator> { <val> | <singletone_select> }
  | <val> [NOT] BETWEEN <val> AND <val>
  | <val> [NOT] LIKE <val> [ESCAPE <val>]
  | <val> [NOT] CONTAINING <val>
  | <val> [NOT] STARTING WITH <val> 
  | <val> [NOT] IN ( { <val> [,<val> ] | <select expression> } )
  | <val> IS [NOT] NULL
  | {ALL | SOME | ANY} (<select expression>)
  | EXISTS (<select expression>)
  | SINGULAR (<select expression>)
  | {AND | OR} [NOT] (<search condition>)
    
<operator> ::=
  { = | < | > | <= | >= | !< | !> | <> | != }

<sort_value_list> ::=
  {<column_name> | <column_number | expression> } [COLLATE <collation> ] [ASC[ENDING] | DESC[ENDING] [NULLS {FIRST|LAST}] ] [, <sort_value_list>]

Описание

Для передачи параметра в предложения First, Skip и Rows параметр надо заключать в скобки:

select first (:param) <список выбираемых полей> from my_table

Пример

 

См. также

Источник

LangRef.pdf, Firebird 1.5 Language Reference Update

($firebird)/doc/sql.extension/README.select_expressions.txt

Обсуждение

Юрий, 2010/12/08 10:11

стоит заметить что ORDER BY может использоваться с параметром DESC

как пример:

SELECT * FROM Table ORDER BY 1 DESC
Руслан, 2011/04/01 03:22

Столкнулся с проблемой: <column_alias_name> нельзя напрямую использовать в <search_condition>, то есть запрос: [code]SELECT FIELD1 AS ALIAS_NAME1 FROM TABLE1 WHERE ALIAS_NAME1 = :some_val[/code] вернет ошибку, что поле ALIAS_NAME1 не существует. Насколько я помню, подобные SQL-конструкции срабатывали еще в FoxPro 2.x. FIELD1, в моем случае, динамический. В Firebird нормального решения пока не нашел. Приходится доп.средствами разбирать и править запрос :-( Может я чего упустил, и все-таки существует волшебная функция поиска поля по алиас-нэйму?

Сергей, 2011/04/27 14:19

они (алиасы) разве не в другом месте запроса стоят?

SELECT prov_org.number, prov_org.name, oblast1.name_oblast, rayon1.name_rayon, naspunkt1.name_naspunkt , street1.name_street, prov_org.dom_kv, prov_org.inn, prov_org.number_dog, prov_org.sut_dog, result.name_result, prov_org.date_post, s1.fio_access, s2.fio_access, poluch_name»;

FROM prov_org, access AS s1, access AS s2, oblast AS oblast1, oblast AS oblast2, rayon AS rayon1, rayon AS rayon2, naspunkt AS naspunkt1, naspunkt AS naspunkt2, street AS street1, street AS street2, result, uslovia, class_dog,  poluch
WHERE prov_org.oblast = oblast1.id_oblast and  prov_org.rayon = rayon1.id_rayon and prov_org.naspunkt = naspunkt1.id_naspunkt and prov_org.street = street1.id_street and prov_org.f_oblast = oblast2.id_oblast and  prov_org.f_rayon = rayon2.id_rayon and prov_org.f_naspunkt = naspunkt2.id_naspunkt and prov_org.f_street = street2.id_street and prov_org.result = result.id_result and prov_org.class_dog = class_dog.id_class_dog and prov_org.uslovia = uslovia.id_uslovia and  prov_org.ecp3 = s2.id_access and prov_org.ecp = s1.id_access 
Руслан, 2011/05/16 09:23

Cергей, Вы меня не поняли. Проблему, конечно, я решил, но в функционале это явная брешь. Помимо «FROM table AS t1» (кстати, сам «AS» тут неприменим. Правильно так: «FROM table t1»), существуют алиасы полей: «SELECT field_name AS lfn FROM table t1». Так вот именно этот «lfn» невозможно использовать в конструкции WHERE. У меня задача больно специфичная, выборка полей в зависимости от прав доступа, и я не всегда знаю, какое реальное поле там может находиться. Предрекая критику, скажу: эти запросы кэшируются и переформировываются крайне редко, при изменении структуры БД или изменении прав доступа.

Антон, 2011/07/31 09:16

<p> Руслан, есть такое решение: </p> <pre class=«code»> SELECT * FROM ( SELECT field_name AS lfn FROM table t1 ) WHERE ( lfn = '123' ) </pre>

Руслан, 2011/08/01 08:31

Спасибо, Антон. Свою проблему решил хранимками, сейчас уже переделывать не буду, но Вашу конструкцию протестировал и взял на заметку. Точнее, я знал, что такая существует, но при решении проблемы она в голову не пришла. Результат дискуссии: волшебной функции нет, есть SELECT FROM SELECT :) И всё равно считаю это недоработкой СУБД. Бубен, конечно, вазелином не смазан, но всё же бубен :) Всем спасибо! Вопрос закрыт.

Антон, 2011/09/05 11:32

Дело в том, что при выполнение запроса сначала обрабатывается ветвь FROM, затем WHERE и только после этого SELECT. Т.е. Firebird ничего не знает про алиас столбца, если встречает его в WHERE.

Олег, 2011/08/29 16:48

Возможно ли в ORDER BY указать список полей для сортировки, переданный во входном параметре? Что-нибудь, типа такого: select * from table1 order by :FSORT где, FSORT = 'field1, field2 desc'

Олег, 2011/08/29 17:13

Речь идёт про изменение сортировки для выходного набора записей из хранимой процедуры. При этом сортировкой хочется управлять, передавая в процедуру параметр.

Attid, 2011/08/30 12:22

нет так нельзя. или через группу if или через execute statement

Олег, 2011/08/30 18:26

Через execute statement сделал, работает. Но меня смущает то, что написано о снижении быстродействия запросов. И всё же, как мне кажется, невозможность использования выражения или числовой переменной для указания сортировки - расходится с документацией.

Олег, 2011/08/30 17:47

Да, я согласен, протупил и в переменной нельзя передать СТРОКУ, но зато можно передать НОМЕР выходного столбца для сортировки. И если его явно указать, то работает: select * from table1 order by 1; При этом (тут, в описании <sort_value_list>) явно указано, что можно использовать выражение (expression) для указания номера столбца. И если, к примеру, в переменной :FSORT передать 1, то запрос не будет работать!!! select * from table1 order by :FSORT; Да даже просто, если выражение явное поставить - не работает: select * from table1 order by BIN_OR(0,1);

Александр, 2012/02/01 07:20

Добрый день, господа знатоки! Имею firebird 1.5.2, имею запрос

Select * From ( SELECT distinct

     c.CLIENT_NAME name,
     d.Docum_num Num,
     o.Oper_summa Summa_Peni,
     o.Oper_date Fakt,
      max(o2.Oper_date) Pl,
     (Max(o.Oper_date)-
      max(o2.Oper_date)) Pros

FROM OPER o

   inner join Docum d on o.Oper_deb = d.Docum_ID
                    AND o.OPER_TYPE = -301
                    AND o.OPER_PLAN = 0
   inner join Client c on c.Client_ID = d.Docum_Client
   inner join Oper o2 on o2.oper_deb = d.Docum_ID
              and o2.oper_plan = 2
              and (extract(year from o2.Oper_Date) = extract(year from o.Oper_date))
              and (extract(month from o2.Oper_Date) = extract(month from o.Oper_date))
              and (extract(day from o2.Oper_Date) <= extract(day from o.Oper_date))

WHERE

    (OPER_DATE > '31.10.2011') AND
    (OPER_DATE < '31.12.2011')

GROUP BY

   c.CLIENT_NAME,
     d.Docum_num,
     o.Oper_summa,
     o.Oper_Date

) Peni WHERE Peni.Pros > 0

Выдает ошибку Invalid token. Dynamic SQL error SQL error code =-104 Token unknown -line 2, char 8 SELECT.

Не могу понять в чем проблема. Подскажите пожалуйста.

Tango, 2013/02/05 15:41

FB 1.5.X не поддерживает вложенные запросы.

Александр, 2012/02/01 07:22

Внутренний запрос сам работает.

Valera, 2012/10/02 23:16

Подскажите пожалуйста, раньше работал такой запрос Select num_reestr as num from reestr where num_reestr = 185; Для меня важно чтобы название возвращаемой колонки было num , а возвращается num_reestr; Для подключеня к базе firebird v2.5 использую последний драйвер JDBC (Jaybird-2.2.0JDK_1.7) + java7 Раньше использовал Jaybird-2.1.6JDK_1.6 + java6 В IBexpert все работает.

Valera, 2012/10/02 23:44

решил вопрос так (java код): String field_name = rs.getMetaData().getColumnLabel(i); Хотя раньше работал такой код: String field_name = rs.getMetaData().getColumnName(i);.

Vladimir Tregub, 2012/11/12 14:44

Неверно указан порядок DISTINCT и FIRST. Указывать нужно сначала FIRST а затем DISTINCT

Только авторизованные участники могут оставлять комментарии.
select.txt · Последние изменения: 2011/06/15 00:29 — 91.205.131.146