sql substr后的值怎么转number
时间: 2023-09-07 18:03:50 浏览: 258
在SQL中,SUBSTR函数用于截取字符串的一部分。如果想要将SUBSTR函数返回的字符串转换为数字类型,可以使用CAST或CONVERT函数来实现。
假设有一个字符串列str,包含数字字符。我们想要截取该列中的一部分字符,并将其转换为数字类型。可以使用SUBSTR函数来截取字符串的一部分,然后使用CAST或CONVERT函数将其转换为数字类型。
示例SQL语句如下:
SELECT CAST(SUBSTR(str, 1, 3) AS NUMBER)
FROM 表名;
上述语句将从str列中截取前三个字符,并将其转换为数字类型。SUBSTR函数的第一个参数是要截取的字符串,第二个参数是截取开始位置,第三个参数是截取的长度。CAST函数用于将截取后的字符串转换为数字类型。最终的查询结果将返回转换后的数字值。
另外,如果数据库支持特定的转换函数,也可以使用数据库提供的转换函数来完成字符串到数字的转换。例如,Oracle数据库中可以使用TO_NUMBER函数来将字符串转换为数字类型。
总之,我们可以使用CAST或CONVERT函数将SUBSTR函数返回的字符串转换为数字类型,或者使用数据库提供的特定转换函数来实现字符串到数字的转换。
相关问题
begin get_dev_cs; end; 运行后没有数据插入制定表 get_dev_cs 代码如下CREATE OR REPLACE PROCEDURE get_dev_cs IS sql_tem VARCHAR2(4000); v_dt NUMBER; BEGIN sql_tem := 'truncate table ycyd.Subscriber_cs'; EXECUTE IMMEDIATE sql_tem; FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.Subscriber_cs SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num FROM jour1.om_subscriber_' || v_dt.db || ' a WHERE a.action = 0'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; END;
根据你提供的代码,我看到了可能导致没有数据插入指定表的问题。在存储过程 `get_dev_cs` 中,你在循环之前执行了 `truncate table ycyd.Subscriber_cs` 的操作,这会清空表中的所有数据。因此,在循环中执行插入操作时,可能没有符合条件的数据可供插入。
如果你希望每次循环前清空表中的数据,你可以将 `truncate` 操作移到循环之外。以下是修改后的代码:
```sql
CREATE OR REPLACE PROCEDURE get_dev_cs IS
sql_tem VARCHAR2(4000);
v_dt NUMBER;
BEGIN
sql_tem := 'truncate table ycyd.Subscriber_cs';
EXECUTE IMMEDIATE sql_tem;
FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db
FROM sys.all_tables a
WHERE a.owner = upper('jour1')
AND a.table_name LIKE upper('om_subscriber_202___')
AND substr(table_name, '15') > 202205) LOOP
-- 循环往表里添加数据
sql_tem := '
INSERT INTO ycyd.Subscriber_cs
SELECT a.order_id,
a.done_date,
a.cust_id,
a.subscriber_ins_id,
a.access_num
FROM jour1.om_subscriber_' || v_dt.db || ' a
WHERE a.action = 0';
-- 执行SQL语句
EXECUTE IMMEDIATE sql_tem;
END LOOP;
END;
```
在修改后的代码中,我们将 `truncate` 操作移到循环之外,这样在每次循环之前都会清空表中的数据。这样,每次循环都可以插入符合条件的数据到表中。
请注意,代码中还有其他可能需要根据实际情况进行调整的部分,比如表名、列名、条件等。在执行这段代码之前,请确保你已经根据实际情况进行了适当的修改。
编译报错 CREATE OR REPLACE PROCEDURE get_dev_cs IS sql_tem VARCHAR2(4000); v_dt NUMBER; BEGIN ----om_subscriber_yyyymm sql_tem := 'truncate table ycyd.Subscriber_cs'; EXECUTE IMMEDIATE sql_tem; FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.Subscriber_cs SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num FROM jour1.om_subscriber_' || v_dt.db || ' a WHERE a.action = 0 AND a.is_usim = 1'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; ----om_order_yyyymm sql_tem := 'truncate table ycyd.order_cs'; EXECUTE IMMEDIATE sql_tem; COMMIT; FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.order_cs SELECT order_id, dev_id FROM JOUR1.om_order_' || v_dt.db || ' b'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; COMMIT; ---dev sql_tem := 'truncate table ycyd.yd_order_dev_3056'; EXECUTE IMMEDIATE sql_tem; -- 添加数据 sql_tem := ' INSERT INTO ycyd.yd_order_dev_3056 SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, d.code, c.dev_busi_code, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM ycyd.Subscriber_cs a LEFT JOIN ycyd.order_cs b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id LEFT JOIN (SELECT DISTINCT oo.code,s.bill_id FROM params1.sec_operator oo, params1.sec_staff s WHERE s.staff_id = oo.staff_id AND oo.state = 1 AND oo.staff_id NOT in ('123402933','123395474','123404209')) d ON c.dev_phone = d.bill_id WHERE c.corp_org = 3056'; -- 执行sql EXECUTE IMMEDIATE sql_tem; COMMIT; END get_dev_cs;
根据你提供的存储过程代码,我注意到在最后一个LEFT JOIN子句中使用了NOT IN来排除特定的staff_id。然而,你在NOT IN子句中使用了字符串而不是逗号分隔的值列表。这可能导致编译错误。
为了解决这个问题,你可以将NOT IN子句修改为使用逗号分隔的值列表。例如:
```sql
LEFT JOIN (
SELECT DISTINCT oo.code, s.bill_id
FROM params1.sec_operator oo, params1.sec_staff s
WHERE s.staff_id = oo.staff_id
AND oo.state = 1
AND oo.staff_id NOT IN (123402933, 123395474, 123404209)
) d ON c.dev_phone = d.bill_id
```
请注意,我将NOT IN子句中的值从字符串转换为了数值,并且没有使用引号。
如果你仍然遇到编译错误,请提供完整的错误消息,以便我能够更准确地帮助你解决问题。
阅读全文