Переменные внутри выбора? - PullRequest
1 голос
/ 07 июня 2011

Можно ли создать псевдоним выражения, возвращаемого оператором SELECT, чтобы ссылаться на него в других частях этого же SELECT, как если бы он был столбцом среди других?

Этакий "временный"переменная ", область действия которой будет ограничена оператором SELECT, немного похоже на предложение WITH перед SELECT для использования временного именованного набора записей.

Наивный пример того, чего я хотел бы достичь:

SELECT
FIRSTNAME + ' ' + NAME AS FULLNAME,
CASE WHEN LEN(FULLNAME)>3 THEN 1 ELSE 0 END AS ISCORRECT
FROM USERS

, где FULLNAME может использоваться для определения последующего поля вывода ISCORRECT , но не является реальным столбцом таблицы USERS ...вместо этого трудоемкого (но работающего), подверженного ошибкам (но работающего) копирования / вставки:

SELECT
FIRSTNAME + ' ' + NAME AS FULLNAME,
CASE WHEN LEN(FIRSTNAME + ' ' + NAME)>3 THEN 1 ELSE 0 END AS ISCORRECT
FROM USERS

Этот пример хорошо описывает то, что я хочу, но я легко могу представить аналогичные потребности, где FULLNAME также может бытьиспользуется в других частях оператора SELECT: в JOIN, в WHERE, в GROUP BY, ORDER BY и т. д.

PS: я использую SQL Server 2005, но также был бы заинтересован в любых спецификациях 2008 годаic answer.

Большое спасибо!: -)

Редактировать:

Несмотря на мое высокое уважение к тем из вас, кто предлагает использовать сторонний или внутренний запрос, я не чувствуюЛегко с такими возможностями.Мой образец действительно наивный.Истинные запросы - это, скорее, 30 выходных полей, включая сложные выражения (включая вызовы функций CLR), 15 внутренних / левых внешних объединений и 20 дополнительных критериев.Я подозреваю, что я скорее не умножал на множество косвенных указаний на совместные запросы, если смогу избежать этого.

Ответы [ 4 ]

4 голосов
/ 07 июня 2011

Полагаю, вам нужно будет поместить его во внутренний запрос, а затем иметь возможность ссылаться на него вне запроса.

Простейший пример, основанный на вашем:

select a.fullname, case when len(a.fullname) > 3 then 1 
                        else 0 end as incorrect
from (select firstname + ' ' + name as fullname
      from users) a
1 голос
/ 07 июня 2011

Пример с CTE

;with names (FULLNAME) as (
    SELECT FIRSTNAME + ' ' + NAME
    FROM USERS
) select
    FULLNAME,
    CASE WHEN LEN(FULLNAME) > 3 THEN 1 ELSE 0 END AS ISCORRECT
FROM names
0 голосов
/ 07 июня 2011

Вы можете использовать cross apply для объединения строк или выполнения вычислений и т. Д., Которые включают только текущую строку.

select T.fullname,
       case when len(T.fullname) > 3 
          then 1
          else 0
       end iscorrect
from users as U
  cross apply
    (select U.firstname+' '+U.name) as T(fullname)
order by T.fullname
0 голосов
/ 07 июня 2011

Хотя он меня не очень устраивает, я выбираю (временно?) Третий вариант: я избегаю совместных запросов и копирую / вставляю свое сложное трудно читаемое выражение (здесь оно обозначается простым псевдонимом FULLNAME).) встраивая его в скалярную функцию ... которая поэтому вызывается несколько раз в разных частях моего SELECT.

SELECT
dbo.GetFULLNAME(FIRSTNAME,NAME) AS FULLNAME,
CASE WHEN LEN(dbo.GetFULLNAME(FIRSTNAME,NAME))>3 THEN 1 ELSE 0 END AS ISCORRECT
FROM USERS

Что вы думаете об этом?(Я уточняю, что хотя это и более сложное и нечитаемое, чем в моем OP, реальное выражение остается «простым» вопросом манипулирования строками с использованием нескольких полей ввода и не включает никаких подзапросов или чего-либо подобного).

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