MySQL: UNION статических полей

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Код: Выделить всё

(SELECT "ab" AS smth)
UNION
(SELECT "cde" AS smth)
ORDER BY smth
Возвращает:

Код: Выделить всё

smth

ab
cd
вопрос: как сделать, чтобы во второй строке было три буквы?

условия:

1. не переставляя запросы местами
2. не добавляя пробел в первом запросе

MySQL 4.0, если важно
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Я только такой извращённый способ придумал:

Код: Выделить всё

(
SELECT LTRIM( LPAD( "ab", 3, ' ' ) ) AS smth
)
UNION (

SELECT "cde" AS smth
)
ORDER BY smth
А вообще, если MySQL позволяет объявлять переменные (что-то вроде declare @a char), то всё что нужно - указать у первой колонки тип varchar
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

AiK, спасибо за ответ,
но в извращённых способах я сам мастак, хоть куда ))
простейший из них - поставить большую строку первой (почему нет?)

а если хочется, чтобы строки шли в порядке ввода, то можно усложнить:

Код: Выделить всё

(SELECT "abc" AS smth, 2 AS id)
UNION
(SELECT "cd" AS smth, 1 AS id)
ORDER BY id
(писать первую строку самой большой, и ставить всем мнимый id в правильном порядке)

но меня именно и интересовало бы "правильное" решение.

Отдельное спасибо за "обьявлять переменные" !
Так у меня всё получилось!

Код: Выделить всё

SET @smth1="de", @smth2="abc";
(SELECT @smth1 AS smth) UNION (SELECT @smth2 AS smth) ORDER BY smth;
результат:

Код: Выделить всё

+------+
| smth |
+------+
| abc  |
| de   |
+------+
хоть и не могу понять, почему, но раз работает, значит всё ок ))

вот только .. я думал, что можно как-то на ходу кастовать ..

Код: Выделить всё

SELECT (CHAR(10)) "ab"
как в языках программирования высокого уровня ..
может синтаксис не знаю, а может и впрямь нельзя ..

а что ты имел ввиду под
Aik писал(а):указать у первой колонки тип varchar
как это можно сделать, не имея таблицы (и не создавая таковую)?
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

Oscar, mySQL, собственно как и другие движки, неявно кастуют переменные к типу, задаваемому первым SELECT'ом в UNION. В более поздних версиях mySQL есть возможность кастануть переменную к CHAR'у нужной длины. Видимо, при объявлении переменных при помощи SET задаётся тип [VAR]CHAR большой длины (в мануале написано про абстрактный string). Поэтому вторая переменная вмещается в размер первой.

OFF: Вообще, это форменное безобразие, что нельзя самому явно указать тип переменной при её объявлении. Вот из-за подобных мелочей я и недолюбливаю mySQL.

У меня, к сожалению, дома mySQL нет, а на этом серваке phpmysql не умеет работать со множественными резалтсетами, так что я вижу только сообщения о том, что первый резалтсет пуст, а второй - содержит две строки. Как подавлять пустые резалтсеты я не знаю (в MSSQL есть такая опция SET nocount on)... Посмотри, плиз, для полноты картины, не задаётся ли какой-нибудь короткий строковый тип, например CHAR[32] или VARCHAR[128] (в MSSQL строковая переменная без специфицированной длины создаётся с длиной 1 при определении переменных и длиной 30 при кастах).
Даже самый дурацкий замысел можно воплотить мастерски
Yurich
Сообщения: 107
Зарегистрирован: 23 фев 2004, 19:07

[quote="Oscar"]

Код: Выделить всё

&#40]

Возвращает:

[code]smth

ab
cd
вопрос: как сделать, чтобы во второй строке было три буквы?

условия:

1. не переставляя запросы местами
2. не добавляя пробел в первом запросе

MySQL 4.0, если важно[/quote]

Начиная с версии 4.1.1 этот запрос работает отлично.

Возвращает:

Код: Выделить всё

smth

ab
cde
В ранних версиях можно использовать следующий workaround:

Код: Выделить всё

(SELECT REPEAT(" ", 10) AS smth)
UNION
(SELECT "ab" AS smth)
UNION
(SELECT "cde" AS smth)
ORDER BY smth
LIMIT 1000000000000
OFFSET 1;
Удачи.
Ответить