Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Убрать отступы в select / 25 сообщений из 31, страница 1 из 2
04.03.2020, 13:50
    #39934129
slj
slj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Добрый день господа.
Часто читаю данный форум, но пишу впервые, поскольку не могу осилить.
Входные данные: Firebird 2.1, продажная база данных.

Имеется рабочая БД, откуда, через IBX выполняю следующий запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT
    C.CODE AS "Табельный",
    C.NAME AS "Ф.И.О.",
    T.TRANZDATE AS "Дата",
    max(T.TRANZTIME) AS "Время",
    T.INFOSTR AS "Карта",
    sum(T.SUMM) AS "Сумма"
FROM
    DOCUMENT D
        LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID
        JOIN CLIENT C ON T.INFO2 = C.CODE
WHERE
      T.TRANZDATE = cast('now' as date) and
      D.STATE = 1 AND
      D.ISFISCAL = 1 AND
      T.TRANZTYPE = '36' and
      T.INFO = '8'
GROUP BY
    C.CODE,
    C.NAME,
    T.TRANZDATE,
    T.INFOSTR



На выходе экспортирую полученные данные из IBX и получаю .txt следующего вида:
4 613 Сидоров Андрей Анатольевич 04.03.2020 10:14:27 1593579 12.000 7 845 Иванов Иван Иванович 04.03.2020 10:14:02 1953722 14.000

Вполне красиво, кроме 000 вместо 00

Далее сделал батник, который надо запускать по расписанию. Через isql выполняю запрос:
таким .bat'ником

Код: plaintext
1.
2.
3.
4.
set isql="C:\Program Files (x86)\FireBird\FireBird_2_1\BIN\isql.exe"
set inputfile="C:\Users\UtkinI\Documents\tee\query.sql"
set outputfile="C:\Users\UtkinI\Documents\tee\output_%Date:~6,4%%Date:~3,2%%Date:~0,2%.txt"

%isql% -i %inputfile% -o %outputfile% -q

выполняю следующий запрос:
Код: sql
1.
2.
3.
CONNECT 'E:\Torgovlya54\MAIN.GDB' user 'SYSDBA' password 'masterkey';
SELECT C.CODE, C.NAME, T.TRANZDATE, max(T.TRANZTIME), T.INFOSTR, sum(T.SUMM) FROM DOCUMENT D LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID JOIN CLIENT C ON T.INFO2 = C.CODE WHERE T.TRANZDATE = cast('now' as date) and D.STATE = 1 AND D.ISFISCAL = 1 AND T.TRANZTYPE = '36' and T.INFO = '8' GROUP BY C.CODE, C.NAME, T.TRANZDATE, T.INFOSTR;
commit work;



и получаю следующее: изображение 123.

В самой БД, например поле NAME имеет VARCHAR100, т.е. строки фиксированной длины, урезать который я пробовал. Мои попытки применить трим в select не увенчались успехом.

Вопрос, как из результата выполнения батника убрать лишние пробелы и лишние нули? Триммировать всю БД не хотелось бы.
...
Рейтинг: 0 / 0
04.03.2020, 13:59
    #39934146
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
slj,

для числовых - cast, например, если есть numeric(18,3), ему можно сделать cast(field as numeric(18,2)), но в этом случае будет специфическое округление, насколько я помню. А для строковых - встроенная функция TRIM, она есть с ФБ 2.0.
https://firebirdsql.org/refdocs/langrefupd20-trim.html
...
Рейтинг: 0 / 0
04.03.2020, 14:52
    #39934188
slj
slj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
kdv,

вот у меня trim не выходит вовсе. или я дурак или...

Код: sql
1.
2.
3.
4.
5.
6.
SELECT C.CODE AS "Табельный", TRIM(C.NAME) AS "Ф.И.О.", T.TRANZDATE AS "Дата", max(T.TRANZTIME) AS "Время", T.INFOSTR AS "Карта", TRIM(sum(T.SUMM)) AS "Сумма"
FROM DOCUMENT D
    LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID
         JOIN CLIENT C ON T.INFO2 = C.CODE
WHERE T.TRANZDATE = cast('now' as date) and D.STATE = 1 AND D.ISFISCAL = 1 AND T.TRANZTYPE = '36' and T.INFO = '8'
GROUP BY C.CODE, C.NAME, T.TRANZDATE, T.INFOSTR;



cast еще не пробовал.
...
Рейтинг: 0 / 0
04.03.2020, 15:01
    #39934194
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Код: sql
1.
2.
select -- урезаем ширину текстового поля записи
  cast( поле as varchar(ширина) ) as "Заголовок"

Примитивно, но громоздко.
Рассмотрите, всё-таки, вариант "форматировать у клиента".
...
Рейтинг: 0 / 0
04.03.2020, 15:01
    #39934195
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
slj
kdv,

вот у меня trim не выходит вовсе. или я дурак или...

Код: sql
1.
2.
3.
4.
5.
6.
SELECT C.CODE AS "Табельный", TRIM(C.NAME) AS "Ф.И.О.", T.TRANZDATE AS "Дата", max(T.TRANZTIME) AS "Время", T.INFOSTR AS "Карта", TRIM(sum(T.SUMM)) AS "Сумма"
FROM DOCUMENT D
    LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID
         JOIN CLIENT C ON T.INFO2 = C.CODE
WHERE T.TRANZDATE = cast('now' as date) and D.STATE = 1 AND D.ISFISCAL = 1 AND T.TRANZTYPE = '36' and T.INFO = '8'
GROUP BY C.CODE, C.NAME, T.TRANZDATE, T.INFOSTR;



cast еще не пробовал.


Код: sql
1.
2.
3.
4.
5.
6.
SELECT C.CODE|| ' ' ||TRIM(C.NAME)|| ' ' || T.TRANZDATE|| ' ' || max(T.TRANZTIME)|| ' ' || T.INFOSTR|| ' ' || TRIM(sum(T.SUMM))
FROM DOCUMENT D
    LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID
         JOIN CLIENT C ON T.INFO2 = C.CODE
WHERE T.TRANZDATE = cast('now' as date) and D.STATE = 1 AND D.ISFISCAL = 1 AND T.TRANZTYPE = '36' and T.INFO = '8'
GROUP BY C.CODE, C.NAME, T.TRANZDATE, T.INFOSTR;
...
Рейтинг: 0 / 0
04.03.2020, 15:04
    #39934197
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
slj,

эээ... неплохо бы в sql втыкать переводы строки по ширине экрана. А то елозить внизу скроллбаром раздражает.
...
Рейтинг: 0 / 0
04.03.2020, 15:43
    #39934231
slj
slj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
kdv
slj,

эээ... неплохо бы в sql втыкать переводы строки по ширине экрана. А то елозить внизу скроллбаром раздражает.


исправлюсь, недоглядел)

pastor,

спасибо огромное. пару полей убрал, но всё равно результат не полный. Что еще надо убрать?
Код: sql
1.
2.
3.
4.
5.
6.
SELECT TRIM(C.CODE) || ' ' || TRIM(C.NAME)|| ' ' || TRIM(T.INFOSTR) || ' ' || TRIM(sum(T.SUMM))
FROM DOCUMENT D
    LEFT JOIN TRANZT T ON D.ID = T.DOCUMENTID
         JOIN CLIENT C ON T.INFO2 = C.CODE
WHERE T.TRANZDATE = cast('now' as date) and D.STATE = 1 AND D.ISFISCAL = 1 AND T.TRANZTYPE = '36' and T.INFO = '8'
GROUP BY C.CODE, C.NAME, T.TRANZDATE, T.INFOSTR;



Результат запроса:
...
Рейтинг: 0 / 0
04.03.2020, 15:53
    #39934234
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
slj

pastor,

спасибо огромное. пару полей убрал, но всё равно результат не полный. Что еще надо убрать?


а ничего. можно еще у isql настроить ширину вывода.

мы себе давно сделали zls_sql, который выводит без разделителей страниц, а при желании в csv или xml
...
Рейтинг: 0 / 0
05.03.2020, 04:45
    #39934401
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Если бы была озвучена исходная задача то можно было бы что-то посоветовать.
Пока что мне нифига непонятно, для чего выгружать именно в txt.

Скорее всего удобнее экспортировать в какой-нибудь xls при помощи IBEScript.

Так же есть подозрение что то что в первом сообщении называется IBX, на самом деле имеется ввиду IBE. :)
...
Рейтинг: 0 / 0
05.03.2020, 04:59
    #39934402
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Мне кажется что на счет trim() тут советуют фигню.
На выходе isql "лишние" пробелы не потому что они в значении поля, а потому что вывод isql пытается изобразить таблицу в текстовом виде, в формате фиксированная ширина полей.

Поля varchar() конечные пробелы вообще не умеют хранить, соответственно и тримировать их не нужно.

Рекомендация собаковода по форматированию запроса:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT
  C.CODE           AS "Табельный",
  C.NAME           AS "Ф.И.О.",
  T.TRANZDATE      AS "Дата",
  max(T.TRANZTIME) AS "Время",
  T.INFOSTR        AS "Карта",
  sum(T.SUMM)      AS "Сумма"

FROM DOCUMENT D
  LEFT  JOIN TRANZT T ON (D.ID    = T.DOCUMENTID)
  INNER JOIN CLIENT C ON (T.INFO2 = C.CODE      )

WHERE (1=1)
  and (T.TRANZDATE = cast('now' as date))
  and (D.STATE     = 1   )
  and (D.ISFISCAL  = 1   )
  and (T.TRANZTYPE = '36')
  and (T.INFO      = '8' )

GROUP BY
  C.CODE,
  C.NAME,
  T.TRANZDATE,
  T.INFOSTR



В select лучше видно какие же поля возвращает запрос.
В from не опускать INNER с целью подровнять участвующие в запросе таблицы в одну колонку.
В where каждое условие начинать с and (если оно конечно and) - тогда при отладке можно легко комментированием отключать условия поштучно.
...
Рейтинг: 0 / 0
05.03.2020, 05:18
    #39934404
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
В IBExpert/IBEScript запрос с экспортом выглядит например так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    select first 5
      cast(data as date     ) as "Дата",
      cast(data as timestamp) as "ДатаВремя",
      summ                    as "Сумма",
      'Текст ' || id          as "Наименование",
      id                      as id
    from dat
    order by data, id

    export as XMLTABLE into 'D:\BankFP\2020\02.xml'
    options '
      CurrencyFormat="[Red]#,##0.00;-#,##0.00"
    ';
...
Рейтинг: 0 / 0
05.03.2020, 06:06
    #39934407
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
fraks
Так же есть подозрение что то что в первом сообщении называется IBX, на самом деле имеется ввиду IBE. :)

Ибо если мы запрос получаем через IBX в Delphi, то отформатировать текстовый вывод можно совершенно без проблем и как угодно.
...
Рейтинг: 0 / 0
05.03.2020, 09:13
    #39934440
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
fraks,

Накидал кучу нравоучений и спорных указаний по самому правильному форматированию кода, притянул IBEScript, а на вопрос автора ответа не предоставил.
Скрипт, конечно, для экспорта хорош, но во многих случаях вполне достаточно isql.
...
Рейтинг: 0 / 0
05.03.2020, 09:22
    #39934443
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
fraks,

никогда не делай LEFT JOIN до INNER JOIN ибо оптимизатор начинает тупить
...
Рейтинг: 0 / 0
05.03.2020, 09:28
    #39934447
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Симонов Денис,

Это не он, а автор.
...
Рейтинг: 0 / 0
05.03.2020, 10:10
    #39934470
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Симонов Денис
fraks,
никогда не делай LEFT JOIN до INNER JOIN ибо оптимизатор начинает тупить

Я и не делаю.
И вообще, максимально избегаю INNER. Даже и не специально, просто так по задаче получается обычно.
...
Рейтинг: 0 / 0
05.03.2020, 10:13
    #39934472
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
fraks
максимально избегаю INNER
Да чего уж мелочиться, давай и JOIN избегай
...
Рейтинг: 0 / 0
05.03.2020, 10:34
    #39934488
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
WildSery
fraks,
Накидал кучу нравоучений и спорных указаний по самому правильному форматированию кода,


Э... в каком месте я сказал что это самое правильное форматирование?
Это была моя рекомендация, и ниже я написал свои обоснования для каждого места, почему я считаю что так лучше.

WildSery
притянул IBEScript, а на вопрос автора ответа не предоставил.
Скрипт, конечно, для экспорта хорош, но во многих случаях вполне достаточно isql.


А я так и не понял в чем собственно состоит вопрос, и эту свою непонятку и озвучил.
Ибо когда ты получаешь на выходе текстовый файл с форматированием полей таблицы пробелами - то тут никаких "лишних" пробелов нет. Если же получать данные в csv - то там выравнивания не будет, и так же, никаких лишних пробелов не будет, ибо varchar(со слов топикстартера, ибо DDL таблицы он не привел).

На сколько я вижу - автор нашел какой-то метод вывода данных, первый попавшийся, и пытается на основе него что-то сделать. Можно сколько угодно выдавать рекомендации, но без знания собственно задачи - а для чего и как потом применяются полученные данные, шансы подсказать правильное решение - не очень велики. Но просто потрындеть можно.

По поводу isql. При наличии IBExpert и IBEScript - этот isql нафиг не нужен.
IMHO у него только одно преимущество - он идет в комплекте. Их чего проистекает 2 момента - его не нужно где-то искать, устанавливать. И это стандартный инструмент для тестирования глючит ли сервер. Для экспорта данных он не пригоден.

Автор может конечно покопать в сторону set width или пытаться сформировать строку csv прямо в запросе.
Но потом будет следующий вопрос - а как убрать недопустимые для csv символы, как как корректно закавычить строковое поле, и т.д.
...
Рейтинг: 0 / 0
05.03.2020, 11:09
    #39934515
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
У полей varchar() не бывает концевых пробелов, соответственно трим тут не поможет никак.

При конкатенации, тип данных результата получается слодением размерности каждого аргумента. Триммируй его или нет, в примере ниже - результат будет varchar(203).

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select
 name,  -- varchar(100)
 gorod, -- varchar(100)

 name || ' (' || gorod || ')' -- varchar(203)

from spost
where (id = 312)



isql будет расчитывать ширину колонки именно под этот большой суммарный тип. Потому там столько пустого места. И трим там не поможет. И cast не поможет, потому как или будут "лишние" пробелы либо исключение "string truncation".

Используйте для вывода данных инструменты для этого предназначенные.
isql - не из их числа, он пригоден только для посмотреть и вывести данные в формате "для АЦПУ".
...
Рейтинг: 0 / 0
05.03.2020, 11:10
    #39934518
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
WildSery
fraks
максимально избегаю INNER
Да чего уж мелочиться, давай и JOIN избегай

Из моей практики INNER нужен в 1-3% запросах. В остальных чисто по логике используется LEFT.
...
Рейтинг: 0 / 0
05.03.2020, 11:16
    #39934521
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
fraks,

какая-то странная у вас статистика. Я бы сказал наоборот 30% LEFT, остальное обычный JOIN.
INNER здесь слово чисто опционально, в LEFT можно тоже использовать OUTER
...
Рейтинг: 0 / 0
05.03.2020, 11:36
    #39934539
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
fraks
Но просто потрындеть можно.
Для этого есть специальные выделенные места
fraks
Из моей практики INNER нужен в 1-3% запросах.
Весьма странная практика. Кроме тебя, другие практикующие с такой статистикой мне не известны.
...
Рейтинг: 0 / 0
05.03.2020, 11:43
    #39934546
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Симонов Денис
fraks,

какая-то странная у вас статистика. Я бы сказал наоборот 30% LEFT, остальное обычный JOIN.
INNER здесь слово чисто опционально, в LEFT можно тоже использовать OUTER

Я вот даже навскидку не могу припомнить где мне в последний раз был нужен именно INNER.

outer + where not null дает тот же результат что и inner, зато мне чисто для мозгов понятнее смысл работы outer.
И с оптимизатором меньше рисков что он задурит.
Если правильно помню, inner применял только в тех случаях когда с ним получался более оптимальный план, который не получалось получить через outer.
...
Рейтинг: 0 / 0
05.03.2020, 11:45
    #39934554
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
fraks
И с оптимизатором меньше рисков что он задурит.
Тут другое: "я отключаю оптимизатор нахрен". Задурить в отключенном состоянии действительно трудно.
...
Рейтинг: 0 / 0
05.03.2020, 11:56
    #39934567
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убрать отступы в select
Ivan_Pisarevsky
fraks
И с оптимизатором меньше рисков что он задурит.
Тут другое: "я отключаю оптимизатор нахрен". Задурить в отключенном состоянии действительно трудно.

Вы так говорите как будто это что-то плохое :)

При написании запроса я практически всегда четко представляю что в каком порядке нужно джойнить что бы с производительностью не получился УПС... И даже с left бывает нужно делать "+0", иногда.
А вот с внезапно изменившимся планом приходилось бороться неоднократно, видимо поэтому и завязал с INNER без особой нужды.

База наполнена данными, порядок и соотношения количества записей по таблицам мне понятно. И процентное соотношение нужных мне значений в нужных мне полях с малым количеством значений, но с индексом - тоже мне известно и для чего я так задумал. Отдай это на волю оптимизатору - и он рано или поздно неприятно удивит. Стабильность - наше всё.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Убрать отступы в select / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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