Консультация № 72589
25.01.2007, 14:33
0.00 руб.
0 9 8
Здраствуйте. У меня два вопроса.
1. Как из поля типа text сделать выборку первых n символов ?
2. После выполнения запроса "SELECT * FROM table;" данные возрашаются в порядке их добавления, а как сделать что бы они шли в обратном порядке или "перевернуть"(в самом sql запросе) ?

Обсуждение

Неизвестный
25.01.2007, 15:09
общий
это ответ
Здравствуйте, Драк Георгий!

1) В SQL-запросе можно выбирать только значения полей. Чтобы выбрать n символов, нужно провести дополнительную обработку выбранных значений.
2) В SQL-запросе можно сделать только ORDER BY, чтобы отсортировать по значению столбца.

Возможно, в какой-то реализации SQL (конкретной СУБД) такие опции предусматриваются. Все зависит от Вашей СУБД.
Неизвестный
25.01.2007, 15:17
общий
СУБД - MySQL.
Неизвестный
25.01.2007, 15:30
общий
это ответ
Здравствуйте, Драк Георгий!
1. Вам поможет функция SUBSTR(имя столбца, с какого символа начинаем, сколько берем)
Пример использования в приложении.
2 Сортировка вызывается конструкцией ORDER BY столбец(или группа столбцов) ASC|DESC (по возрастанию|по убыванию)
Например,
SELECT EMPNO, ENAME FROM EMP ORDER BY EMPNO - сортировать столбец EMPNO по возрастанию (ASC можно не указывать)
SELECT EMPNO, ENAME FROM EMP ORDER BY EMPNO DESC - сортировать столбец EMPNO по убыванию.
SELECT EMPNO, ENAME FROM EMP ORDER BY EMPNO ,ENAME- сортировать сначала столбец EMPNO, в случае одинаковых значений сортировать по столбцу ENAME

Также, во многих базах вместо указания названия столбца можно использовать его номер в запросе, например последний запрос можно переписать так:
SELECT EMPNO, ENAME FROM EMP ORDER BY 1,2



Приложение:
mysql> create table test (id int,mycol text);Query OK, 0 rows affected (0.05 sec)mysql> insert into test (id,mycol) values (1,‘Небольшой текст для проверки‘) ;Query OK, 1 row affected (0.00 sec)mysql> select * from test -> ;+------+------------------------------+| id | mycol |+------+------------------------------+| 1 | Небольшой текст для проверки |+------+------------------------------+1 row in set (0.02 sec)mysql> select substr(mycol,1,5) from test -> ;+-------------------+| substr(mycol,1,5) |+-------------------+| Небол |+-------------------+1 row in set (0.00 sec)
Неизвестный
25.01.2007, 15:58
общий
это ответ
Здравствуйте, Драк Георгий!
Может немного не такой будет ответ, но для MS SQL работает так:
1. В самом запросе можно обрабатывать строковые поля при помощи функций Left, Right, Len, Ltrim, Rtrim, Trim, Substring и другие. Эти функции встроены в язык T-SQL.
Для Вас подойдет запрос " Select Left ( Name , 5 ) as Small_Name From table".
2. На самом деле последовательность записей в Вашем запросе могла быть и другой. Записи в запросе не отсортированы, поэтому они отображаются по мере их добавления. Для возможности использования сортировок в запросах желательно наличие ключевых полей, будь то дата создания записи, номер документа, код записи и т.п.
Тогда Ваш запрос можно было бы продолжить примерно так :
"... Order by Data_Doc, Nom_Doc"
Второе условие сортировки необходимо для сортировки внутри даты.
При наличии таких полей возможен отбор записей по условию, например:
"... Where Data_Doc>cdate ( ‘25.06.2006‘ ) and Data_Doc<cdate ( ‘30.06.2006‘ ) Order by Data_Doc, Nom_Doc"
В некоторых СУБД имеется специальный тип поля - счетчик, который однозначно идентифицирует запись и автоматически присваивается при добавлении новой записи.
Если в Вашей базе в добавляемой записи нет такого поля, которое бы как-то отличало эту запись от существующих ( т.е. у каждой последующей записи значение поля больше ( или меньше ) , чем у всех предыдущих ) , то отсортировать в порядке их добавления или убывания будет невозможно.
Т.е. если в Вашей базе имеется поле типа ДАТА, и у нескольких записей значение этого поля совпадает, то после сортировки по полю внутри группы записей с одинаковым значением порядок расположения может быть разным в различные моменты времени запроса.
Сортировка может быть не только по полю, а и по результатам вычислений, например:
"... Order by Day (Data_Doc ) , Month (Data_Doc ) , Year (Data_Doc ) , Nom_Doc"
Записи выведутся группами по дням, внутри одного дня отсортированы по месяцам, а внутри месяца по годом.
Т.е. получится список 1.5.03 , 1.6.03 , 1.6.04 , 2.4.02 , 2.6.03 и т.д.
С уважением.
Неизвестный
25.01.2007, 17:01
общий
это ответ
Здравствуйте, Драк Георгий!
1. Функция left в MS SQL есть ("select left(field_name, 5) from table_name" вернет первые пять символов
2. Пользуйтесь сортировкой (конструкция "order by <FIELD_NAME> desc" отсортирует поле по убыванию)- например: "select name, last_name, age from clients order by name desc")
Неизвестный
25.01.2007, 17:26
общий
это ответ
Здравствуйте, Драк Георгий!
Согласну Help от MS SQL Server 2000, для этого используется следующая функция:

SUBSTRING
Returns part of a character, binary, text, or image expression. For more information about the valid Microsoft® SQL Server™ data types that can be used with this function, see Data Types.

Syntax
SUBSTRING ( expression , start , length )

Arguments
expression

Is a character string, binary string, text, image, a column, or an expression that includes a column. Do not use expressions that include aggregate functions.

start

Is an integer that specifies where the substring begins.

length

Is an integer that specifies the length of the substring (the number of characters or bytes to return).

Note Because start and length specify the number of bytes when SUBSTRING is used on text data, DBCS data, such as Kanji, may result in split characters at the beginning or end of the result. This behavior is consistent with the way in which READTEXT handles DBCS. However, because of the occasional strange result, it is advisable to use ntext instead of text for DBCS characters.

Return Types
Returns character data if expression is one of the supported character data types. Returns binary data if expression is one of the supported binary data types.

The returned string is the same type as the given expression with the exceptions shown in the table.

Given expression Return type
text varchar
image varbinary
ntext nvarchar

Remarks
Offsets (start and length) using the ntext, char, or varchar data types must be specified in number of characters. Offsets using the text, image, binary, or varbinary data types must be specified in number of bytes.

Note Compatibility levels can affect return values. For more information about compatibility levels, see sp_dbcmptlevel.

Use SUBSTRING with text, ntext, and image data
This example shows how to return the first 200 characters from each of a text and image data column in the publishers table of the pubs database. text data is returned as varchar, and image data is returned as varbinary.

USE pubs
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo,
SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = ‘1756‘

Here is the result set:

pub_id logo pr_info
------ ---------------------- ----------
1756 0x474946383961E3002500 This is sa

(1 row(s) affected)

This example shows the effect of SUBSTRING on both text and ntext data. First, this example creates a new table in the pubs database named npr_info. Second, the example creates the pr_info column in the npr_info table from the first 80 characters of the pub_info.pr_info column and adds an ü as the first character. Lastly, an INNER JOIN retrieves all publisher identification numbers and the SUBSTRING of both the text and ntext publisher information columns.

Удачи!
Неизвестный
25.01.2007, 17:33
общий
это ответ
Здравствуйте, Драк Георгий!

Select * from Table order by Field Asc (если в порядке возрастания по этому полю)
Select * from Table order by Field Desc (если в порядке убывания по этому полю)

Вместо имени поля можно поставить номер поля по порядку перечисления в запросе

Select Fild1, Cnt(Fld2), Fld3 from Table
group by Fld2
order by 2

Неизвестный
26.01.2007, 06:28
общий
это ответ
Здравствуйте, Драк Георгий!
1) что вы понимаете под типом text ?
2) для определения порядка записей результата запроса используется директива ORDER BY имя_поля
то есть ваш запрос быдет выглядеть так "SELECT * FROM table ORDER BY field_name" где field_name - имя поля по которому будет произведена сортировка
полей сортировки можно указать несколько через запятую
можно указать так же вид сортировки по возрастанию (используется по умолчанию) и по убыванию
пример запроса с сортировки по возрастанию "SELECT * FROM table ORDER BY field_name ASC"
пример запроса с сортировки по убыванию "SELECT * FROM table ORDER BY field_name DESC"
Неизвестный
26.01.2007, 15:20
общий
это ответ
Здравствуйте, Драк Георгий!
1) SUBSTRING (‘Строка‘,стартовая позиция,количество символов)
2) Order By ColumnName ASC/DESC
ASC - сортировка по возрастанию (по умолчанию, можно неуказывать)
DESC - сортировка по убыванию

Select tableID, Substring (FullName, 1,2)
From Table
Order by tableID DESC, FullName ASC
Форма ответа