powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Убрать отступы в select
25 сообщений из 31, страница 1 из 2
Убрать отступы в select
    #39934129
slj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
slj
Гость
Добрый день господа.
Часто читаю данный форум, но пишу впервые, поскольку не могу осилить.
Входные данные: 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
Убрать отступы в select
    #39934146
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slj,

для числовых - cast, например, если есть numeric(18,3), ему можно сделать cast(field as numeric(18,2)), но в этом случае будет специфическое округление, насколько я помню. А для строковых - встроенная функция TRIM, она есть с ФБ 2.0.
https://firebirdsql.org/refdocs/langrefupd20-trim.html
...
Рейтинг: 0 / 0
Убрать отступы в select
    #39934188
slj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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 еще не пробовал.
...
Рейтинг: 0 / 0
Убрать отступы в select
    #39934194
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
select -- урезаем ширину текстового поля записи
  cast( поле as varchar(ширина) ) as "Заголовок"

Примитивно, но громоздко.
Рассмотрите, всё-таки, вариант "форматировать у клиента".
...
Рейтинг: 0 / 0
Убрать отступы в select
    #39934195
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Убрать отступы в select
    #39934197
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slj,

эээ... неплохо бы в sql втыкать переводы строки по ширине экрана. А то елозить внизу скроллбаром раздражает.
...
Рейтинг: 0 / 0
Убрать отступы в select
    #39934231
slj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
slj
Гость
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
Убрать отступы в select
    #39934234
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slj

pastor,

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


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

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

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

Так же есть подозрение что то что в первом сообщении называется IBX, на самом деле имеется ввиду IBE. :)
...
Рейтинг: 0 / 0
Убрать отступы в select
    #39934402
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется что на счет 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
Убрать отступы в select
    #39934404
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 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
Убрать отступы в select
    #39934407
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks
Так же есть подозрение что то что в первом сообщении называется IBX, на самом деле имеется ввиду IBE. :)

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

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

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

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

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


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

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


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

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

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

Автор может конечно покопать в сторону set width или пытаться сформировать строку csv прямо в запросе.
Но потом будет следующий вопрос - а как убрать недопустимые для csv символы, как как корректно закавычить строковое поле, и т.д.
...
Рейтинг: 0 / 0
Убрать отступы в select
    #39934515
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У полей 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
Убрать отступы в select
    #39934518
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery
fraks
максимально избегаю INNER
Да чего уж мелочиться, давай и JOIN избегай

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

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

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

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

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

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

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

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


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