Собственно запрос
Select t_id,end_data,
case when tbl_city.NAZV is null then tc_name else tc_name || ', ' || NAZV end || ', ' || address as NAZV,
case status when 0 then 'Не подтверждена' when 1 then 'Подтверждена' when 2 then 'В работе' when 3 then 'На проверке' else 'Закрыта' end as st,
case when cell_ticket is null then 'Не назначено' else cell_ticket end as st,
case when cell_ticket is null then 'Не указано' else cell_ticket end as cell
from us_ticket.ticket
join us_ticket.tbl_countryside on ticket.city_id = tbl_countryside.tc_id
left join us_ticket.tbl_city on tbl_countryside.citycode = tbl_city.city_id;
Ошибка на строке
case when cell_ticket is null then 'Не указано' else cell_ticket end as cell
Как только ее убираю все начинает работать. Ругается на эту часть then "Не указано"
Текст ошибки
ОШИБКА: неверное значение для целого числа: «Не указано»
СТРОКА 1: …та’ end as st, case when cell_ticket is null then ‘Не указан…
Я уже искал и пытался исправить ошибку, но я не мог этого сделать. В чем проблема внутри моего кода? Я вставлю код и ошибку ниже. Как я понимаю, это о типе данных. Если я сделаю какие-либо грамматические ошибки, извините за это.
$sql = <<<SQL
INSERT INTO karakter (KullanıcıAdı,uid,Isim,Cinsiyet,Irk,Boy,Kilo,Gün,Ay,Yıl,Güç,Bünye,Dayanıklılık,Çeviklik,Karizma,Zeka,İrade,Odaklanma,Ustalık,Ziraat,İşçilik,Aşçılık,Botanik,Balıkçılık,Dericilik,Marangozluk,Hekimlik,VahşiYaşam,DuvarUstalığı,Camcılık,Demircilik,Avcılık,Şarapçılık,Çekilme,Kalkan,Hançer,Kılıç,Balta,Gürz,Mızrak,Yay,Arbalet)
VALUES ("$user","$uid","$isim","$cinsiyet","$irk","$boy","$kilo","$gun","$ay","$yil","$Güç","$Bünye","$Dayanıklılık","$Çeviklik","$Karizma","$Zeka","$İrade","$Odaklanma","$Ustalık",'$Ziraat',"$İşçilik","$Aşçılık","$Botanik","$Balıkçılık","$Dericilik","$Marangozluk","$Hekimlik","$VahşiYaşam","$DuvarUstalığı","$Camcılık","$Demircilik","$Avcılık","$Şarapçılık","$Çekilme","$Kalkan","$Hançer","$Kılıç","$Balta","$Gürz","$Mızrak","$Yay","$Arbalet")
ON DUPLICATE KEY UPDATE
KullanıcıAdı=VALUES(KullanıcıAdı),
uid=VALUES(uid),
Isim=VALUES(Isim),
Cinsiyet=VALUES(Cinsiyet),
Irk=VALUES(Irk),
Boy=VALUES(Boy),
Kilo=VALUES(Kilo),
Gün=VALUES(Gün),
Ay=VALUES(Ay),
Yıl=VALUES(Yıl),
Güç=VALUES(Güç),
Bünye=VALUES(Bünye),
Dayanıklılık=VALUES(Dayanıklılık),
Çeviklik=VALUES(Çeviklik),
Karizma=VALUES(Karizma),
Zeka=VALUES(Zeka),
İrade=VALUES(İrade),
Odaklanma=VALUES(Odaklanma),
Ustalık=VALUES(Ustalık),
Ziraat=VALUES(Ziraat),
İşçilik=VALUES(İşçilik),
Aşçılık=VALUES(Aşçılık),
Botanik=VALUES(Botanik)
SQL;
Ошибка:
Неверное целочисленное значение: » для столбца ‘Ziraat’ в строке 1
3
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
1 |
|
26.10.2015, 14:03. Показов 25628. Ответов 23
Добрый день! Скажите, пожалуйста. Можно в PostgreSQL как-нибудь автоматически заполнить таблицу данными из Excel?
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
26.10.2015, 14:25 |
2 |
напрямую в excel не уверен, что такое есть… но есть запись данных в CSV-файл. см. COPY
1 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 07:04 [ТС] |
3 |
У меня прав нет: Я еще пробовала через интерфейс pgAdmin III сделать. Выбираю таблицу, в меню выбираю Импорт. Открывается окно: ‘Import data from file into tablename’ Нужно выбрать формат и кодировку. Формат выбираю csv, кодировку — по умолчанию UTF8. Жму Импорт. Выдает ошибку: Неверная последовательность байт для кодировки UTF8.
0 |
grgdvo 1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
||||
27.10.2015, 07:43 |
4 |
|||
Да, забыл про права суперпользователя… Для psql тоже достаточно легко делается
Жму Импорт. Выдает ошибку: Неверная последовательность байт для кодировки UTF8. А выбранный файл точно имеет кодировку UTF8??? Я вот у себя решил проверить, все импортиться прекрасно.
1 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 08:14 [ТС] |
5 |
А выбранный файл точно имеет кодировку UTF8??? Не точно. Я что-то не помню, как проверить кодировку. Файл экселевский.
0 |
grgdvo 1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
||||
27.10.2015, 08:21 |
6 |
|||
Вы на windows или linux?
0 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 08:25 [ТС] |
7 |
Windows. Выбрала кодировку win1251. Все равно ошибка.
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
27.10.2015, 08:44 |
8 |
Может тогда cp866 Добавлено через 6 минут
0 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 09:44 [ТС] |
9 |
У меня нет такого варианта. Есть вариант WIN866
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
27.10.2015, 09:55 |
10 |
Полагаю стоит заново начать с экспорта в экселе, заново сделать CSV-файл, открыть его тем же notepad’ом и посмотреть, что там внутри. Я сейчас не могу проверить WIN866, но позже просто ради интереса попробую.
0 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 10:43 [ТС] |
11 |
Я не очень поняла) Это не экспортированный файл. Просто экселевский файл. Сама создавала. Сейчас сохранила как csv. Открыла notepad’ом. Там все нормально отображается, только вместо границ ячеек ‘;’ Зашла в Notepad на вкладку Кодировки. Там отмечена Кодировка в UTF-8 (без BOM).
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
27.10.2015, 12:59 |
12 |
Ну теперь импорт полученного csv-файла делайте в postgresql. что получится?
0 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 13:12 [ТС] |
13 |
grgdvo, спасибо! С кодировкой понятно Добавлено через 2 минуты
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
27.10.2015, 13:33 |
14 |
точка с запятой к следующим столбцам относится. Нужно указать, что разделителем полей будет «точка с запятой», по умолчанию «запятая» используется (от CSV = Comma-Separated Values). Но Excel почему-то решил, что надо непременно «;» использовать.
1 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 13:48 [ТС] |
15 |
Спасибо,grgdvo, получилось импортировать!)) Последний вопрос. У меня десятичный разделитель был запятая, перед импортом я заменила ее на точку. Потом я буду импортировать файл, где 6000 записей, и тоже везде десятичный разделитель запятая. Лучше в Excel везде поменять на точку или можно где-нибудь при импорте указать, что десятичный разделитель запятая?
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
27.10.2015, 14:07 |
16 |
Будет проще и быстрее поменять в экселе запятую на точку, чем городить с локализацией и восприятием формата вещественного числа.
1 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
27.10.2015, 14:09 [ТС] |
17 |
Ясно, спасибо!
0 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
29.10.2015, 07:24 [ТС] |
18 |
grgdvo, а Вы пробовали импортировать столбцы, в которых есть кириллица? У таких столбцов все-таки проблема с кодировкой
0 |
1213 / 938 / 373 Регистрация: 02.09.2012 Сообщений: 2,862 |
|
29.10.2015, 13:27 |
19 |
У меня CSV-файл был в кодировке UTF-8 и база данных создана в UTF-8. Все импортировалось успешно!
0 |
240 / 34 / 7 Регистрация: 05.05.2012 Сообщений: 515 |
|
29.10.2015, 13:29 [ТС] |
20 |
А где проверить кодировки CSV-файла и базы данных?
0 |
i have a table:
id | detail
1 | ddsffdfdf ;df, deef,"dgfgf",/dfdf/
when I did: insert into details values(1,'ddsffdfdf ;df, deef');
=> got inserted properly
When I copied that inserted value from database to a file,the file had: 1 ddsffdfdf ;df, deef
Then I loaded the whole csv file to pgsql database,with values in the format: 1 ddsffdfdf ;df, deef
ERROR: invalid input syntax for integer: «1 ddsffdfdf ;df, deef is obtained. How to solve the problem?
asked May 29, 2015 at 11:25
user3823859user3823859
4691 gold badge7 silver badges20 bronze badges
3
CSVs need a delimiter that Postgres will recognize to break the text into respective fields. Your delimiter is a space, which is insufficient. Your CSV file should look more like:
1,"ddsffdfdf df, deef"
And your SQL should look like:
COPY details FROM 'filename' WITH CSV;
The WITH CSV is important because it tells Postgres to use a comma as the delimiter and parses your values based on that. Because your second field contains a comma, you want to enclose its value in quotes so that its comma is not mistaken for a delimiter.
To look at a good example of a properly formatted CSV file, you can output your current table:
COPY details TO '/your/filename.csv' WITH CSV;
answered May 29, 2015 at 11:29
vol7ronvol7ron
40.4k21 gold badges117 silver badges172 bronze badges
14
-
#1
C PostgreSQL не работа, но надо пару задач сделать. Подскажите, нужно безусловное приводение типов к int / decimal. Что бы не валилась ошибка, а то валится в FATAL, ибо обработчик такой:
PHP:
<?php
/**
* Класс для работы с базой данных PostgreSQL
*/
class app_db_pgsql
{
/**
* Аттрибут объекта содержит текущую ссылку на соединение с СУБД (connection id)
* @var resource|null
*/
private static $connection_id;
/**
* Аттрибут содержит ресурс выполненный функцией pg_execute
* @var resource
*/
private $_last_pg_query_resource;
/**
* Метод выполняет соединение с postgresql или если соединение установлено возвращает текущий линк
* @return resource
*/
private function connection_id()
{
if (!isset(self::$connection_id))
{
if (! (self::$connection_id = pg_connect("host=localhost dbname=db user=use password=pass")) )
{
trigger_error("Ошибка соединения с базой данных PostgreSQL: ".pg_last_error(), E_USER_ERROR);
}
pg_set_client_encoding(self::$connection_id, "koi8-r"); // устанавлиаем кодировку клиента в соотвествии с кодировкой сайта
}
return self::$connection_id;
}
/**
* Метод подготовки SQL запроса
* @param unknown $query
* @return boolean
*/
public function prepare($query)
{
if (! pg_prepare($this->connection_id(), "", $query) )
{
trigger_error("Подготовка SQL запроса {$query} завершилось неудачно: ".pg_last_error($this->connection_id()), E_USER_ERROR);
}
return $this;
}
/**
* Выполняем подготовленный SQL запрос
* @param array $params
* @return app_db_pgsql
*/
public function execute(array $params = array())
{
if (! ($this->_last_pg_query_resource = pg_execute($this->connection_id(), "", $params)) )
{
trigger_error("Выполнение ранее подгтовленного запроса произошло с ошибкой: ".pg_last_error($this->connection_id()), E_USER_ERROR);
}
return $this;
}
/**
* Получаем строку
* @return array
*/
public function fetch_row()
{
return pg_fetch_row($this->_last_pg_query_resource);
}
/**
* Получаем строку (ассоциативный массив)
* @return array
*/
public function fetch_assoc()
{
return pg_fetch_assoc($this->_last_pg_query_resource);
}
/**
* Выполняет SQL без предподготовки, но с параметрами
* @param string $query
* @param array $params
* @return app_db_pgsql
*/
public function query_params($query, array $params = array())
{
if (! ($this->_last_pg_query_resource = pg_query_params($this->connection_id(), $query, $params)) )
{
trigger_error("Выполнение запроса c параметрами произошло с ошибкой: ".pg_last_error($this->connection_id()), E_USER_ERROR);
}
return $this;
}
/**
* Возвращает количество затронутых строк
* @return number
*/
public function num_rows()
{
return pg_num_rows($this->_last_pg_query_resource);
}
}
Пробовал собственно так:
PHP:
public function getTwByCode($tw_code)
{
$pg = new app_db_pgsql();
$pg->query_params("select * from type_of_work where tw_code = cast($1 as int8)", array($tw_code));
if ($pg->num_rows() === 1)
{
return $pg->fetch_assoc();
}
return false;
}
Валится с ошибкой , в случае плохого INT’а:
Код:
Warning: pg_query_params() [function.pg-query-params]: Query failed: ОШИБКА: неверное значение для целого числа: "a" in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 95
Fatal error: Выполнение запроса c параметрами произошло с ошибкой: ОШИБКА: неверное значение для целого числа: "a" in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 97
На PHP приводить к unsigned int не вариант (поскольку максимального значения для PHP-шного INT меньше чем bigint PostreSQL)
Последнее редактирование: 19 Май 2014
-
#3
Вот в чем проблема:
is_number не подойдет, ибо:
Код:
Warning: pg_query_params() [function.pg-query-params]: Query failed: ОШИБКА: значение "9223372036854775808" вне диапазона для типа bigint in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 95
Fatal error: Выполнение запроса c параметрами произошло с ошибкой: ОШИБКА: значение "9223372036854775808" вне диапазона для типа bigint in /var/www/x.web.local/httpdocs/x/app/db/pgsql.php on line 97
-
#4
preg_match() + сравнение строк.
-
#5
Подскажите, нужно безусловное приводение типов к int / decimal. Что бы не валилась ошибка…
А к какому числу это безусловное приведение должно приводить букву «a» или число за пределами диапазона int8?
-
#6
Вот кстати придумалось Элегантное Решение:
Код:
create function shit_to_integer(incoming_shit text, default_shit int8 default null)
returns int8
as $$
begin
begin
return incoming_shit::int8;
exception
when numeric_value_out_of_range or invalid_text_representation then
return default_shit;
end;
end;
$$ language plpgsql immutable called on null input security definer;
Соответственно shit_to_integer(‘a’) вернёт нам null, shit_to_integer(‘a’, 666) вернёт 666.
-
#7
А к какому числу это безусловное приведение должно приводить букву «a» или число за пределами диапазона int8?
Есть два варианта:
1. Передано не число;
2. Передано число за приделами.
MySQL приводит к пустоте (но не NULL), насколько я знаю. В MySQL проверка входных данных и генерация ошибок , подобных PG — это strict mode, который отключается.
1 — ое еще теститься на валидацию;
2 — ое уже нельзя проверить, в PHP.
За функцию спасибо)
Последнее редактирование: 20 Май 2014