csinálok egy teszt táblát, amiben van egy fix 9 karakter széles mező, ebbe szeretném belerakni az id mezőt balról 0-val feltöltve 9 szélesen.
mit rontok el?
chartestdb=> create table test(id serial, m char(9));
CREATE TABLE
chartestdb=> insert into test (id) values (nextval('test_id_seq'));
INSERT 0 1
chartestdb=> insert into test (id) values (nextval('test_id_seq'));
INSERT 0 1
chartestdb=> select * from test;
id | m
----+---
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
(10 rows)
chartestdb=> update test set m=to_char(id,'000000009');
ERROR: value too long for type character(9)
chartestdb=> update test set m='123456789';
UPDATE 10
chartestdb=>
- 1022 megtekintés
Hozzászólások
A to_char() második paramétere egy decimális helyiértéket ír elő. Amikor az id=10, akkor nem konvertálható ilyen formába.
- A hozzászóláshoz be kell jelentkezni
próbáld ki egyel kevesebb nullával.
- A hozzászóláshoz be kell jelentkezni
Én most ezért nem teszek fel egy postgrest. de szerintem próbáld ki '0999999999' paraméterrel.
- A hozzászóláshoz be kell jelentkezni
chartestdb=> update test set m=to_char(id,'099999999');
ERROR: value too long for type character(9)
még egyszer sorvezetővel:
-------------------------------------------123456789
chartestdb=> update test set m=to_char(id,'099999999');
ERROR: value too long for type character(9)
- A hozzászóláshoz be kell jelentkezni
Kilencig el tudok számolni sorvezető nélkül is :-) Sőt azt is sejtem, hogy text != char(9).
- A hozzászóláshoz be kell jelentkezni
dts=# update test set m=to_char(id,'09999999');
UPDATE 10
dts=# select * from test;
id | m
----+-----------
1 | 00000001
2 | 00000002
3 | 00000003
4 | 00000004
5 | 00000005
6 | 00000006
7 | 00000007
8 | 00000008
9 | 00000009
10 | 00000010
(10 rows)
dts=#
A to_char visszatérési értéke text típusú, ami tartalmazza a termináló NULL karaktert is. Vegyél fel egy karakterrel hosszabb mezőt, vagy konvertáld a text típust char(9)-re.
- A hozzászóláshoz be kell jelentkezni
ha hosszabb mezőt veszek és 9 karakterrel töltöm fel, akkor elérak egy szóközt.
az, hogy a text termináló null karakter lenne a végén, némiképp cáfolni látszik az, hogyha:
update test set m=substring(to_char(id,'099999999'),2,9);
ezt írom, akkor jó lesz az eredmény.
inkább saccolnám, hogy van előtte egy hossz byte...
de szerintem ez postgres bug, hiszen ha mindkét mező típusa ismert, tudnia kellene konvertálni.
- A hozzászóláshoz be kell jelentkezni
"...ha hosszabb mezőt veszek és 9 karakterrel töltöm fel, akkor elérak egy szóközt..."
"...inkább saccolnám, hogy van előtte egy hossz byte..."
dts=# select id,to_char(id,'FM099999999') from test;
id | to_char
----+-----------
1 | 000000001
2 | 000000002
3 | 000000003
4 | 000000004
5 | 000000005
6 | 000000006
7 | 000000007
8 | 000000008
9 | 000000009
10 | 000000010
(10 rows)
Inkább saccolnám, hogy van előtte egy space... 'FM099999999' a barátod!
- A hozzászóláshoz be kell jelentkezni
hmm. ez az fm jónak tűnik. köszi.
- A hozzászóláshoz be kell jelentkezni
további vicces vagy nem értem dolog:
insert into test (id) values (123456789);
update test set m=substring(to_char(id,'099999999'),2,9);
UPDATE 11
chartestdb=> select * from test;
id | m
-----------+-----------
1 | 000000001
2 | 000000002
3 | 000000003
4 | 000000004
5 | 000000005
6 | 000000006
7 | 000000007
8 | 000000008
9 | 000000009
10 | 000000010
123456789 | 123456789
- A hozzászóláshoz be kell jelentkezni
Bzmg... számot, SZÁMOT karakteres mezőbe rak... Normáááális?
- A hozzászóláshoz be kell jelentkezni
egyrészt nem értem, mi a bajod ezzel, másrészt eddig szakmai topicot nem fikáztunk szét...
- A hozzászóláshoz be kell jelentkezni
Ha ott mindig szám lesz, akkor ott számtípust kell megadni. Nagyon számít a hatékonyságnak, hogy milyen adattípusokat használsz. Nem mindegy.
- A hozzászóláshoz be kell jelentkezni
bocs, de én erre most nem tudok korrekt választ adni.
- A hozzászóláshoz be kell jelentkezni
Nézd meg a specifikációban.
- A hozzászóláshoz be kell jelentkezni
Aki _számot_ karakterként akar tárolni az messze van a szakmaiságtól, bár lehet, hogy te hegesztettél többet adatbázist, te dolgoztál 3500 usert kiszolgáló Oracle-alapú webes rendszer fejlesztésén pár évet... No mindegy, ilyet még dBase-ben sem illett csinálni...
- A hozzászóláshoz be kell jelentkezni
a dbase minden számot így tárolt.
a specifikációmból pedig hiányzik, hogy mit mondjak erre, úgy gondoltam, ha már segítséget kérek, akkor önerőből nem írok olyan választ, amit egyébként szoktam.
te meg honnan tudod, hogy nekem mire kell?
- A hozzászóláshoz be kell jelentkezni
te mondtad, hogy 0...n-ig számokat akarsz benne tárolni. Ha egy tárolandó adatra nincs speckó, akkor vissza kell kérdezni, hogy mi legyen. (A barbár "akkó' varchar2(1024)" verziótól most tekintsünk el, az ilyen adatbázisgányolók tojjanak sünt)
- A hozzászóláshoz be kell jelentkezni
mondtam olyat, hogy számokat akarok benne tárolni?
ja, megnéztem közben a speckót, az van benne, hogy ne higgy olyannak, akit elvakított a féklámpa...:P
- A hozzászóláshoz be kell jelentkezni
Javaslom a dokumentáció olvasását!
chartestdb=> update test set m=LPAD(id, 9, '0');
http://www.postgresql.org/docs/8.3/interactive/functions-string.html
- A hozzászóláshoz be kell jelentkezni
Nem nyert:
sgyori@hp6730s:~$ psql dts -U dts
psql (8.4.2)
Type "help" for help.
dts=# update test set m=LPAD(id, 9, '0');
ERROR: function lpad(integer, integer, unknown) does not exist
LINE 1: update test set m=LPAD(id, 9, '0');
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
- A hozzászóláshoz be kell jelentkezni
Mondom én, hogy doksit kell olvasni! 8o)
UPDATE test SET m = LPAD(''||id, 9, '0');
(első paraméter szöveges kell legyen)
- A hozzászóláshoz be kell jelentkezni
az explicit típuskonverzió szerintem korrektebb megoldás.
- A hozzászóláshoz be kell jelentkezni
Ja, csak az Oracle hátteremmel (implicit típuskonverzió) kicsit idegen ez az explicit, meg nem is tudom a legújabb szintaxist (
id::text
helyett azt hiszem van újabb).
- A hozzászóláshoz be kell jelentkezni