คำถามติดแท็ก cast

3
PostgreSQL ใช้การนับ () เพื่อกำหนดเปอร์เซ็นต์ (ปัญหาการส่ง)
ฉันพยายามเรียกใช้แบบสอบถามต่อไปนี้เพื่อให้% ของแถวในpatientsตารางของฉันที่มีค่าrefinstคอลัมน์ ฉันได้รับผลลัพธ์เป็น 0 select (count (refinst) / (select count(*) from patients) * 100) as "Formula" from patients; ตารางมี 15556 แถวและselect count(refinst) from patientsบอกฉันว่า 1446 ของแถวนั้นมีค่าในrefinstคอลัมน์ การตอบสนองที่ฉันต้องการได้รับจากแบบสอบถามจะเท่ากับ 30.62 ( 1446/15556*100=30.62XXXXXปัดเศษเป็นทศนิยมสองตำแหน่ง) ฉันค่อนข้างแน่ใจว่ามีบางอย่างเกี่ยวกับประเภทข้อมูลของผลลัพธ์การนับ (จำนวนเต็มที่ฉันสมมติ) หากฉันหารจำนวนเต็มด้วยจำนวนเต็มและผลลัพธ์มีค่าน้อยกว่า 0 จะถูกปัดเศษเป็น 0 ที่ถูกต้องหรือไม่ หากเป็นกรณีนี้มีใครแสดงให้ฉันเห็นวิธีการนับผลลัพธ์เป็นจำนวนที่มีทศนิยม 2 ตำแหน่งเพื่อที่ผลลัพธ์จะถูกปัดเศษเป็นทศนิยม 2 ตำแหน่งเช่นกัน ฉันแน่ใจว่ามีวิธีที่ดีกว่าในการเขียนรหัสนี้มากกว่าหลายคำสั่งนับ ฉันกำลังมองหาวิธีที่มีประสิทธิภาพโปรเซสเซอร์มากขึ้นในการเขียนแบบสอบถามนี้โดยเฉพาะ
19 postgresql  count  cast 

1
ฉันจะแยก ctid ลงในหมายเลขหน้าและแถวได้อย่างไร
แต่ละแถวในตารางมีคอลัมน์ระบบ ctidประเภทtidที่แสดงถึงตำแหน่งทางกายภาพของแถว: create table t(id serial); insert into t default values; insert into t default values; select ctid , id from t; ctid | รหัส : ---- | -: (0,1) | 1 (0,2) | 2 dbfiddle ที่นี่ อะไรคือวิธีที่ดีที่สุดในการได้รับเพียงจำนวนหน้าเป็นจากctidในประเภทที่เหมาะสมที่สุด (เช่นinteger, bigintหรือnumeric(1000,0))? วิธีเดียวที่ฉันสามารถคิดเป็นน่าเกลียดมาก

1
ถอดรหัส Base64 String ใน SQL Server
ฉันมีvarcharคอลัมน์ในตารางใน SQL Server ซึ่งเก็บสตริงข้อความที่เข้ารหัส base64 ซึ่งฉันต้องการถอดรหัสเป็นข้อความธรรมดาที่เทียบเท่า SQL Server มีฟังก์ชันดั้งเดิมใด ๆเพื่อจัดการกับสิ่งนี้หรือไม่? สตริง base64 ตัวอย่าง: cm9sZToxIHByb2R1Y2VyOjEyIHRpbWVzdGFtcDoxNDY4NjQwMjIyNTcxMDAwIGxhdGxuZ3tsYXRpdHVkZV9lNzo0MTY5ODkzOTQgbG9uZ2l0dWRlX2U3Oi03Mzg5NjYyMTB9IHJhZGl1czoxOTc2NA== ซึ่งถอดรหัสเป็น: role:1 producer:12 timestamp:1468640222571000 latlng{latitude_e7:416989394 longitude_e7:-738966210} radius:19764

1
การสืบค้น JSONB ใน PostgreSQL
ฉันมีตารางpersonsซึ่งมีสองคอลัมน์และคอลัมน์ที่idใช้ JSONB data(ตารางนี้เพิ่งสร้างขึ้นเพื่อวัตถุประสงค์ในการสาธิตเพื่อเล่นกับการสนับสนุน JSON ของ PostgreSQL) ตอนนี้มันควรจะมีสองบันทึก: 1, { name: 'John', age: 30 } 2, { name: 'Jane', age: 20 } ตอนนี้ฉันควรจะได้ชื่อของทุกคนที่อายุมากกว่า 25 แล้วสิ่งที่ฉันได้ลองคือ: select data->'name' as name from persons where data->'age' > 25 น่าเสียดายที่นี่ทำให้เกิดข้อผิดพลาด ฉันสามารถแก้ไขได้โดยใช้->>แทน->แต่จากนั้นการเปรียบเทียบไม่ทำงานตามที่คาดไว้อีกต่อไปเนื่องจากไม่ใช่การเปรียบเทียบตัวเลข แต่การแสดงเป็นสตริง select data->'name' as name from persons where data->>'age' > '25' จากนั้นฉันก็พบว่าฉันสามารถแก้ปัญหาได้จริงโดยใช้->และนักแสดงไปที่int: select data->'name' …

1
ผลลัพธ์ที่น่าแปลกใจสำหรับประเภทข้อมูลที่มีตัวแก้ไขประเภท
ในขณะที่พูดคุยโซลูชัน CTE แบบเรียกซ้ำสำหรับคำถามนี้: รับ 5 ค่าที่แตกต่างล่าสุดสำหรับแต่ละ ID @ypercubeพบข้อผิดพลาดที่น่าแปลกใจซึ่งทำให้เราตรวจสอบการจัดการกับตัวดัดแปลงประเภท เราพบพฤติกรรมที่น่าประหลาดใจ 1. Type cast ยังคงประเภทโมดิฟายเออร์ในบางบริบท แม้เมื่อสั่งไม่ให้ ตัวอย่างพื้นฐานที่สุด: SELECT 'vc8'::varchar(8)::varchar หนึ่งอาจคาดหวังvarchar(ไม่มีตัวดัดแปลง) อย่างน้อยฉันจะ แต่ผลลัพธ์คือvarchar(8)(พร้อมตัวดัดแปลง) กรณีที่เกี่ยวข้องจำนวนมากในซอด้านล่าง 2. การต่อข้อมูล Array สูญเสียโมดิฟายเออร์ในบริบทบางอย่าง โดยไม่จำเป็นต้องใช้ดังนั้นข้อผิดพลาดนี้อยู่ฝั่งตรงข้าม: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) นิพจน์แรกให้ผลvarchar(8)[]ตามที่คาดไว้ แต่ข้อที่ 2 หลังจากการต่อข้อมูลอื่นvarchar(8)จะถูกรดน้ำลงไปเพียงvarchar[](ไม่มีตัวปรับแต่ง) พฤติกรรมที่คล้ายกันจากarray_append()ตัวอย่างในซอด้านล่าง ทั้งหมดนี้ไม่สำคัญในบริบทส่วนใหญ่ Postgres จะไม่สูญเสียข้อมูลและเมื่อกำหนดให้กับคอลัมน์ค่าจะถูกบังคับให้เป็นประเภทที่ถูกต้องอย่างไรก็ตาม อย่างไรก็ตามการทำผิดในทิศทางตรงกันข้ามจะทำให้เกิดข้อยกเว้นที่น่าประหลาดใจ: 3. Recursive CTE ต้องการประเภทข้อมูลให้ตรงกัน รับตารางง่ายนี้ CREATE TABLE a ( …

1
ทำไมฉันต้องส่ง NULL ไปเป็นประเภทคอลัมน์
ฉันมีผู้ช่วยที่กำลังสร้างรหัสเพื่อทำการอัปเดตจำนวนมากสำหรับฉันและสร้าง SQL ที่มีลักษณะดังนี้: (ทั้งประเภทที่ใช้งานอยู่และเขตข้อมูลหลักเป็นประเภทboolean) UPDATE fields as t set "active" = new_values."active","core" = new_values."core" FROM (values (true,NULL,3419), (false,NULL,3420) ) as new_values("active","core","id") WHERE new_values.id = t.id; อย่างไรก็ตามมันล้มเหลวด้วย: ERROR: column "core" is of type boolean but expression is of type text ฉันสามารถทำให้มันทำงานได้โดยเพิ่ม::booleanโมฆะ แต่มันดูแปลกทำไม NULL ถึงถูกพิจารณาว่าเป็นประเภทTEXTใด นอกจากนี้ยังเป็นการยากที่จะร่ายเพราะมันต้องการการทำใหม่ของโค้ดเพื่อให้รู้ว่าควรใช้ NULL แบบใด (รายการของคอลัมน์และค่าปัจจุบันถูกสร้างอัตโนมัติจากอาร์เรย์ของวัตถุ JSON แบบง่าย ๆ …
10 postgresql  null  cast 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.