powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос на выборку данных
30 сообщений из 30, показаны все 2 страниц
запрос на выборку данных
    #33432785
tomasso
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
У меня такой вопрос:
есть таблица с полями
id_name name
-------- -------
1 Вася
2 Лена
6 Костя
8 Василиса
9 Володя
10 Света
12 Денис
13 Тоня
14 Костя
всего 9 записей
Как в DB2 составить запрос на выборку, например, с 3-ей по 7-ую записи?
В mysql аналог limit
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33432808
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если говорить о том, что с третьей - то, такое не предусмотрено.
А ограничить выборку N записей:
Код: plaintext
1.
select * from TBL fetch first  10  rows only
Если хочешь считывать строки страницами (по 10 штук), то сохраняй id последней записи и делай так:
Код: plaintext
1.
select * from TBL where ID> id_save fetch first  10  rows only
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33432816
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tomassoДобрый день!
У меня такой вопрос:
есть таблица с полями
id_name name
-------- -------
1 Вася
2 Лена
6 Костя
8 Василиса
9 Володя
10 Света
12 Денис
13 Тоня
14 Костя
всего 9 записей
Как в DB2 составить запрос на выборку, например, с 3-ей по 7-ую записи?
В mysql аналог limit
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select * 
  from (
          select id_name,
                 name,
                 row_number() over(order by id_name) as rn
            from ТАБЛИЦА_С_ИМЕНАМИ
       )
 where rn between  3  and  7 
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33432867
tomasso
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо!!!
Выручили!
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33433419
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanЕсли говорить о том, что с третьей - то, такое не предусмотрено.

Предусмотрено, еще как предусмотренно...
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33433496
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Herr Developer gardenmanЕсли говорить о том, что с третьей - то, такое не предусмотрено.

Предусмотрено, еще как предусмотренно...
Нука-нука... )) Покажи...))
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33433567
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman Herr Developer gardenmanЕсли говорить о том, что с третьей - то, такое не предусмотрено.

Предусмотрено, еще как предусмотренно...
Нука-нука... )) Покажи...))

Код: plaintext
1.
...row_number() over(order by id_name) as rn...
Чем нерешения?! ))
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33433675
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тем, что сначала полною выборку построит, потом- пронумерует, профильтрует и тока тотом ответ даст. Во как!... Решение, но не производительное. Фигня короче.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33433764
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanА тем, что сначала полною выборку построит, потом- пронумерует, профильтрует и тока тотом ответ даст. Во как!... Решение, но не производительное. Фигня короче.
Так работает же "фигня такая" Тем более "тут" мигрируют с MySQL
Самой простой способ сделать ограниченный и кустамизированный по сорту листинг!
И уж на много "дешевле", чем вытаскавать все на клиента и там "колбасить"
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33434038
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, если уж на то пошло, то есть замечательная функция keep, которая позволяет пронумеровать записи без привлечения аналитических функций:

дивися:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
connect to test@

with 
	tmp (i,n,x,dt,tm,ts) as (
		values (
			 1 ,
			int(rand()* 1000 ),
			round(rand()* 1000 , 2 ),
			current date - int( 365 *rand()) days,
			current time - int(rand()* 10000 ) seconds,
			current timestamp - int(rand()* 10000 ) seconds
		)
	union all
		select 
			i+ 1 ,
			int(rand()* 1000 ),
			round(rand()* 1000 , 2 ),
			current date - int( 365 *rand()) days,
			current time - int(rand()* 10000 ) seconds,
			current timestamp - int(rand()* 10000 ) seconds
		from
			tmp
		where
			i< 10 
	)
select 
	i,
	keep(n) 	previous, 
	n 			current,
	n-keep(n) 	difference,
	decimal(keep(x), 17 , 2 ) keep_x,
	decimal(x-keep(x), 17 , 2 ) x_keep_x,
	decimal(x, 17 , 2 ) x,
	dt,
	keep(dt),
	tm,
	keep(tm),
	ts,
	keep(ts)
from 
	tmp@


I           PREVIOUS    CURRENT     DIFFERENCE  KEEP_X              X_KEEP_X            X                   DT          9           TM        11        TS                          13                         
----------- ----------- ----------- ----------- ------------------- ------------------- ------------------- ---------- ---------- -------- -------- -------------------------- --------------------------
           1             0           468           468                  0 , 00                743 , 74                743 , 74   08 . 05 . 2005  -           23 : 23 : 56  -         2005 - 07 - 20 - 22 . 43 . 41 . 328000  -                         
           2           468           599           131                743 , 74              - 635 , 46                108 , 28   23 . 10 . 2004   08 . 05 . 2005   22 : 06 : 34   23 : 23 : 56   2005 - 07 - 20 - 23 . 28 . 26 . 328000   2005 - 07 - 20 - 22 . 43 . 41 . 328000 
           3           599           361         - 238                108 , 28                464 , 13                572 , 41   11 . 12 . 2004   23 . 10 . 2004   22 : 42 : 15   22 : 06 : 34   2005 - 07 - 20 - 23 . 40 . 33 . 328000   2005 - 07 - 20 - 23 . 28 . 26 . 328000 
           4           361           517           156                572 , 41                230 , 47                802 , 88   16 . 02 . 2005   11 . 12 . 2004   00 : 07 : 14   22 : 42 : 15   2005 - 07 - 21 - 00 . 19 . 30 . 328000   2005 - 07 - 20 - 23 . 40 . 33 . 328000 
           5           517           657           140                802 , 88              - 633 , 90                168 , 98   17 . 03 . 2005   16 . 02 . 2005   22 : 39 : 30   00 : 07 : 14   2005 - 07 - 20 - 21 . 59 . 46 . 328000   2005 - 07 - 21 - 00 . 19 . 30 . 328000 
           6           657           147         - 510                168 , 98                335 , 83                504 , 81   08 . 11 . 2004   17 . 03 . 2005   00 : 34 : 10   22 : 39 : 30   2005 - 07 - 20 - 23 . 22 . 47 . 328000   2005 - 07 - 20 - 21 . 59 . 46 . 328000 
           7           147           303           156                504 , 81                188 , 08                692 , 89   25 . 08 . 2004   08 . 11 . 2004   00 : 21 : 10   00 : 34 : 10   2005 - 07 - 20 - 22 . 06 . 30 . 328000   2005 - 07 - 20 - 23 . 22 . 47 . 328000 
           8           303           153         - 150                692 , 89                - 9 , 69                683 , 19   03 . 08 . 2004   25 . 08 . 2004   00 : 33 : 02   00 : 21 : 10   2005 - 07 - 20 - 23 . 33 . 40 . 328000   2005 - 07 - 20 - 22 . 06 . 30 . 328000 
           9           153           177            24                683 , 19              - 491 , 84                191 , 35   21 . 12 . 2004   03 . 08 . 2004   22 : 27 : 49   00 : 33 : 02   2005 - 07 - 20 - 22 . 18 . 33 . 328000   2005 - 07 - 20 - 23 . 33 . 40 . 328000 
          10           177           732           555                191 , 35                312 , 57                503 , 92   26 . 05 . 2005   21 . 12 . 2004   23 : 25 : 33   22 : 27 : 49   2005 - 07 - 20 - 22 . 28 . 34 . 328000   2005 - 07 - 20 - 22 . 18 . 33 . 328000 

   10  record(s) selected.


...
Рейтинг: 0 / 0
запрос на выборку данных
    #33434104
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenmanНу, если уж на то пошло, то есть замечательная функция keep, которая позволяет пронумеровать записи без привлечения аналитических функций:

А где эта замечательная функция KEEP есть то?
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33434577
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gardenmanА тем, что сначала полною выборку построит, потом- пронумерует, профильтрует и тока тотом ответ даст. Во как!... Решение, но не производительное. Фигня короче.Хех, а как ты хотел, однако???
Вот предположим, есть у тебя выборка. Пусть в ней будет 1000000 строк. Пусть ты хочешь показать строки с 999990 по 1000000 (это очень стандартная ситуация, к примеру, постраничный просморт данных на веб-сайте). Тут ты хоть матушку-репку пой, но тебе-таки придется выдернуть все 1000000 записей, чтобы добраться до 10 последних.
Как вариант, можно скомбинировать fetch first N rows only с аналитической функцией. Кроме того, если сортировка не нужна, то можно аналитическую функцию указать без кляузы ORDER BY (то есть написать row_number() over() ). Всё это позволит немного улучшить картину, но только в тех случаях, когда мы будем выбирать небольшое число строк от начала результирующего датасета.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33434583
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир Конев
...row_number() over(order by id_name)
Наличие индекса по id_name тоже
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33434697
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
golsa2Владимир Конев
...row_number() over(order by id_name)
Наличие индекса по id_name тожеЕсли честно, то я не понял, что ты ЭТИМ хотел сказать...
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33435056
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Herr Developer gardenmanНу, если уж на то пошло, то есть замечательная функция keep, которая позволяет пронумеровать записи без привлечения аналитических функций:

А где эта замечательная функция KEEP есть то?

Эта волшебная функция есть у меня
Позволяет сохранить значение поля для выражений в следующей строке.
Т.е. позволяет очень очень быстро выполнять некоторые аналитические функции без всяких сортировок (типа расчета остатков нарастающим итогом)
Особенно если идет по индексу - вообще веселуха.

Я б даже для IBM сделал suggestion чтоб они эту фичу в стандартную возможность DB2 записали.
кстати на эту идею меня TORT натолкнул еще год назад.

Может исходники выложить? Они ооочень короткие и оооочень простые. Хочешь?

автор
Хех, а как ты хотел, однако???


Однако не надо мне объяснять прописные истины. Я лишь хочу подчеркнуть тот факт, что все в итоге зависит от проектирования. И такие запросы как - дать 10 записей из выборки начиная с 100-й - яркий пример как впустую транжирить ресурсы сервера. Я в своей базе никогда не допущу подобного.

В противовес - дать 10 записей начиная со значения ключа - совсем другое дело. Тут накладные расходы сервера - минимальны.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33435091
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
WITH Q1(ID_NAME, ROW_NUM) AS
(SELECT MIN(G.ID_NAME),  1 
FROM TABLE1 G
UNION ALL
SELECT G.ID_NAME, Q1.ROW_NUM +  1 
FROM TABLE1 G, Q1
WHERE Q1.ROW_NUM <  3 
  AND G.ID_NAME = (SELECT MIN(T1.ID_NAME) FROM TABLE1 T1 WHERE T1.ID_NAME > Q1.ID_NAME)),

Q2(START_ID) AS
(SELECT MAX(Q1.ID_NAME)
FROM Q1)

SELECT G.ID_NAME, G.NAME
FROM TABLE1 G
WHERE G.ID_NAME >= (SELECT Q2.START_ID FROM Q2)
FETCH FIRST  7  ROWS ONLY
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33435157
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexey Popov
Прикольно. )) Сначала прошагать нужное количество записей, а потом выбрать столько сколько нужно. Только >3 надо параметризовать. А так действительно - все верно. Вариант почти рабочий. Но опять же - накладных расходов много будет если "пропустить записей нужно будет много.

Дело в том, что запрос Q1 пойдет по индексу - это еще не факт.
Так что нужно подправить.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33435258
Фотография Alexey Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 gardenman
Понимаю, что будет фетч всех записей от первой до стартовой (третьей) ради её нахождения. И будет странно, если не по индексу.
Отличие от варианта с ROW_NUMBER в том, что предикаты по ключевому полю должны сработать быстрее. IMHO.

Если это простой листинг данных порциями, то разумнее запоминать последний ID_NAME с последуйщим запросом новой порции данных. Как в твоём первом ответе.
Но в вопросе это не видно (мне).
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33435383
Herr Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman
Я б даже для IBM сделал suggestion чтоб они эту фичу в стандартную возможность DB2 записали.
кстати на эту идею меня TORT натолкнул еще год назад.

Начнеться public beta Viper'a тогда надо делать suggestion IBMу

gardenman
Может исходники выложить? Они ооочень короткие и оооочень простые. Хочешь?

Сейчас думаю, где бы это могло пригодиться...
Во, например, можно легко график баланса сделать, как денюжки клиентов притикали/отнекали во времени

Выкладывай сюда!
Или лучше сделать ветку типа "KEEP - bla-bla-bla function"
Чтоб, если что, народ мог свои wishes писать и благодарности
...
Рейтинг: 0 / 0
запрос на выборку данных
    #33435400
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок!)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
запрос на выборку данных
    #35584125
olegrolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот задался вопросом - надо сделать пэйджинг таблицы.
Всё бы хорошо, да id не инкрементируется, т.е. не 1,2,3... 99,100, а рандомные. Записей много - миллион, т.е. считывать весь миллион записей и выдавать, скажем, 100, пользователю - не рационально. Как здесь быть?
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35584762
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
olegrolikВот задался вопросом - надо сделать пэйджинг таблицы.
Всё бы хорошо, да id не инкрементируется, т.е. не 1,2,3... 99,100, а рандомные. Записей много - миллион, т.е. считывать весь миллион записей и выдавать, скажем, 100, пользователю - не рационально. Как здесь быть?Как часто записи в таблице удаляются или вставляются?
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35584989
olegrolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein, спасибо за ответ. Нашёл вариант вот такой:
SELECT * FROM (
SELECT id, name,
rownumber() OVER
()
AS ROW_NEXT
FROM hockey
)
as product_temp WHERE
ROW_NEXT BETWEEN 0 and 100

У меня будет веб-приложение (страничка-jsp) а там легко сохранять 0 и 100, потом изменять эти значения на 101 и 200, и так далее...
Хотелось бы услышать ваш вариант.
Записи будут добавляться постоянно. Это тестовое приложение для изменения записей в таблице, но возможно практическое применение.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35585522
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
olegrolikMark Barinstein, спасибо за ответ. Нашёл вариант вот такой:
SELECT * FROM (
SELECT id, name, rownumber() OVER() AS ROW_NEXT
FROM hockey
) as product_temp
WHERE ROW_NEXT BETWEEN 0 and 100

У меня будет веб-приложение (страничка-jsp) а там легко сохранять 0 и 100, потом изменять эти значения на 101 и 200, и так далее...
Хотелось бы услышать ваш вариант.
Записи будут добавляться постоянно. Это тестовое приложение для изменения записей в таблице, но возможно практическое применение.На миллионе записей у вас будет очень плохая производительность.
Если вам действительно нужно пейджить такое огромное кол-во записей, то здесь я вижу 2 варианта:
1. Держать отдельную таблицу, в которой при каждой вставке/удалении надо будет перенумеровывать строки без пропусков
2. Открывать scrollable курсор и фетчить записи по абсолютному/относительному смещению по нужному кол-ву записей

1-й не подхоит из-за частых изменений
2-й может не подойти, если вы не сможете сохранять для пользователя его ResultSet между вызовами
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35589468
olegrolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Держать отдельную таблицу, в которой при каждой вставке/удалении надо будет перенумеровывать строки без пропусков
2. Открывать scrollable курсор и фетчить записи по абсолютному/относительному смещению по нужному кол-ву записей

1-й не подхоит из-за частых изменений
2-й может не подойти, если вы не сможете сохранять для пользователя его ResultSet между вызовами

1. Не пойму для чего нужна отдельная таблица? Можно немного поподробнее?
2. Я в программировании БД не силён, думаю надо почитать литературу.

А всё же если просто делать пэйджинг без редактирования записей (для начала так - просмотр данных и всё), мой вариант годится?
Т.е. на форме будет две кнопки - предыдущие 100 записей , следующие 100 записей . И при нажатии на каждую кнопку, будет вызываться select (см. выше какой) и данные будут отображаться на jsp-страничке.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35591621
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
olegrolik1. Не пойму для чего нужна отдельная таблица? Можно немного поподробнее?
2. Я в программировании БД не силён, думаю надо почитать литературу.

А всё же если просто делать пэйджинг без редактирования записей (для начала так - просмотр данных и всё), мой вариант годится?
Т.е. на форме будет две кнопки - предыдущие 100 записей , следующие 100 записей . И при нажатии на каждую кнопку, будет вызываться select (см. выше какой) и данные будут отображаться на jsp-страничке.При каждом вызове вашего запроса будут происходить следующие вещи:
1. Сканирование миллиона записей
2. Выборка 100 записей
1-й шаг - весьма затратное действие, особенно, когда много пользователей.
Ваша задача - либо уменьшить число шагов 1, либо избавиться от них вообще.

Извавиться от шагов 1 можно либо введя доп. таблицу "перекодировки", либо ввести доп. поле в этой таблице.
Тогда запрос для доп. таблицы hockey_ext:
Код: plaintext
1.
2.
3.
4.
5.
id | ordered_id
1  | 1
3  | 2
10 | 3
...
будет выглядеть примерно так:
select h.*
from hockey h
join hockey_ext e on h.id=e.id
where e.id_ordered between v1 and v1+100;

Уменьшить число шагов 1 можно, открыв курсор с большим числом записей 1 раз, а потом на запросы получения след. порции просто прокручивать этот курсор, не заставляя сервер каждый раз при этом выполнять дорогостоящее сканирование.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35592028
olegrolik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. говоря проще, добавить в таблицу новое поле order_id, где значения будут инкрементами (от 1 до миллиона). И делать выборку по этому полю. Верно?
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35592649
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В CookBook для 9.5 есть такой пример.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
WITH temp (inv#, c#, sd, sv, n) AS      
  (SELECT  inv.*                        
          , 1                             
   FROM    invoice inv                  
   WHERE   inv# =                       
          (SELECT MIN(inv#)             
           FROM   invoice)              
   UNION   ALL                          
   SELECT  new.*, n +  1                  
   FROM    temp    old                  
          ,invoice new                  
   WHERE   old.inv# < new.inv#          
     AND   old.n    <  5                  
     AND   new.inv# =                   
          (SELECT MIN(xxx.inv#)         
           FROM   invoice xxx           
           WHERE  xxx.inv# > old.inv#)  
  )                                     
SELECT   *                              
FROM     temp;                          

если вместо (SELECT MIN(inv#) FROM invoice) подставить нужное значение то можно будет гулять по все таблице.
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35592659
olzhas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так же там есть примеры использования функции Lag и Lead которые показывают значение предыдущей и следующей записи.
Проверить у себя не могу но думаю что то типа

Код: plaintext
select * from table1 where id between  23434  and lead(id, 100 ) 
...
Рейтинг: 0 / 0
запрос на выборку данных
    #35592678
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
olegrolikТ.е. говоря проще, добавить в таблицу новое поле order_id, где значения будут инкрементами (от 1 до миллиона). И делать выборку по этому полю. Верно?Это будет работать только если у вас:
- не будет удалений записей
- операции вставки никогда не будут отваливаться по ошибке
- инкрементное поле будет no cache или при рестарте базы вы будете руками рестартовать инкремент с существующего макс. значения+1

Иначе у вас будут появляться дыры в нумерации.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / запрос на выборку данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]