พิมพ์สตริงเป็นจำนวนเต็ม - Postgres


123

ฉันกำลังนำเข้าข้อมูลจากตารางที่มีฟีดดิบใน Varchar ฉันต้องการนำเข้าคอลัมน์ใน varchar ลงในคอลัมน์สตริง ฉันลองใช้<column_name>::integerเช่นเดียวกับto_number(<column_name>,'9999999')แต่ฉันได้รับข้อผิดพลาดเนื่องจากมีช่องว่างสองสามช่องฉันจึงต้องดึงข้อมูลเหล่านั้นเป็นช่องว่างหรือว่างในตารางใหม่

โปรดแจ้งให้เราทราบหากมีฟังก์ชันที่เหมือนกัน


5
คุณช่วยแสดงข้อความแสดงข้อผิดพลาดให้เราทราบได้ไหม นั่นจะช่วยได้
Frank Heikens

คำตอบ:




28

หากคุณต้องการจัดการคอลัมน์ว่างเป็นNULLs ให้ลองทำดังนี้:

SELECT CAST(nullif(<column>, '') AS integer);

ในทางกลับกันหากคุณมีNULLค่าที่ต้องหลีกเลี่ยงให้ลอง:

SELECT CAST(coalesce(<column>, '0') AS integer);

ฉันเห็นด้วยข้อความแสดงข้อผิดพลาดจะช่วยได้มาก


25

วิธีเดียวที่ฉันจะไม่เกิดข้อผิดพลาดเนื่องจาก NULL หรืออักขระพิเศษหรือสตริงว่างคือการทำสิ่งนี้:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table

2
สำหรับฉัน (9.6.2) นี่เป็นสิ่งเดียวที่ใช้ได้ผลคำตอบอื่น ๆ ทั้งหมดล้มเหลว
Jasper de Vries

2
คุณไม่สามารถเพิ่มWHERE <column> != NULL?
Matthieu

14

ฉันไม่สามารถแสดงความคิดเห็น (ชื่อเสียงน้อยเกินไปฉันค่อนข้างใหม่) ในโพสต์ของ Lukas

ในการตั้งค่า PG ของฉันto_number(NULL)ไม่ทำงานดังนั้นวิธีแก้ปัญหาของฉันคือ:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table

1
สิ่งนี้ควรใช้งานได้ แต่ควรจะเทียบเท่ากับNULLIF()วิธีการที่ละเอียดน้อยกว่า มาตรฐานกำหนด NULLIF เป็นรูปแบบของเพรดิเคต CASE
kgrittn

13

หากค่ามีอักขระที่ไม่ใช่ตัวเลขคุณสามารถแปลงค่าเป็นจำนวนเต็มได้ดังนี้:

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

ตัวดำเนินการ CASE ตรวจสอบ <คอลัมน์> หากตรงกับรูปแบบจำนวนเต็มจะแปลงอัตราเป็นจำนวนเต็มมิฉะนั้นจะส่งกลับ 0



1

ปัญหาทั่วไป

พิมพ์อย่างไร้เดียงสาหล่อสตริงใด ๆ เป็นจำนวนเต็มเช่นนั้น

SELECT ''::integer

มักส่งผลให้เกิดข้อผิดพลาดที่มีชื่อเสียง:

Query failed: ERROR: invalid input syntax for integer: ""

ปัญหา

PostgreSQL ไม่มีฟังก์ชั่นที่กำหนดไว้ล่วงหน้าสำหรับการได้อย่างปลอดภัยหล่อพิมพ์สตริงเป็นจำนวนเต็ม

สารละลาย

สร้างฟังก์ชั่นที่ผู้ใช้กำหนดแรงบันดาลใจจากของ PHP intval ()ฟังก์ชั่น

CREATE FUNCTION intval(character varying) RETURNS integer AS $$

SELECT
CASE
    WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
    ELSE 0
END AS intval;

$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

การใช้

/* Example 1 */
SELECT intval('9000');
-- output: 9000

/* Example 2 */
SELECT intval('9gag');
-- output: 9

/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0

0

สองเซ็นต์ของฉันสำหรับการแคสต์สตริงใด ๆ เป็นจำนวนเต็ม:

SELECT REGEXP_REPLACE('0' || "<column>", '[[:alpha:]]', '', 'g')::int

ขึ้นอยู่กับhttps://www.postgresqltutorial.com/regexp_replace/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.