Greenplum中使用regexp_like

本文介绍了如何在Orcle和Postgresql数据库中使用正则表达式进行模式验证,包括手机号码、身份证号和座机号码的验证方法。

CREATE OR REPLACE FUNCTION regexp_like(str character, reg character)
  RETURNS boolean AS
$BODY$
declare
v_match  text;
begin
select regexp_matches(str,reg) into v_match;
if v_match is not NULL then
return true;
else
return false;
end if;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION regexp_like(character, character)
  OWNER TO gpadmin;
测试:
--手机号码:
select regexp_like('+8618618888888','^ *(\\+86)?1[3|4|5|8]{1}[0-9]{9} *$');
---身份证号:
select regexp_like('120225198700000000','^([0-9]{15}$|^[0-9]{18}$|^[0-9]{17}([0-9]|X|x))$');
---座机号码:
select regexp_like('022-29778888','^ *0[0-9]{2,3}-?[0-9]{7,8} *$','i')

我们在SQL使用正则表达式进行格式校验,在Orcle中经常使用regexp_like,Postgresql中正则判断函数regexp_matches返回匹配的字符串,使用上有些不顺手,故改之


<think>在Greenplum中,`to_date`函数是标准日期转换函数,通常用于将字符串转换为日期类型。但用户询问的是替代方法,可能出于以下原因: - 环境限制(如函数被禁用) - 需要自定义解析逻辑 - 性能优化考虑 根据引用内容,Greenplum支持标准PostgreSQL日期函数。以下是替代方案: --- ### 方案1:使用`::date` + 格式匹配(推荐) ```sql SELECT '20250605'::date; -- 直接转换YYYYMMDD格式字符串 ``` **结果**:`2025-06-05`(自动转为日期类型) **注意**:仅支持`YYYYMMDD`或`ISO 8601`格式(如`2025-06-05`),非标准格式需预处理: ```sql -- 处理斜杠格式(引用[1]提到'2025/06/05') SELECT REPLACE('2025/06/05', '/', '')::date; ``` --- ### 方案2:`date_trunc` + 文本截取(复杂格式) 若输入是时间戳数值(如`20250605183045`,引用[3]场景): ```sql SELECT date_trunc('day', to_timestamp(20250605183045::text, 'YYYYMMDDHH24MISS') -- 转为时间戳后截取日期 )::date ``` --- ### 方案3:字符串拼接(极端情况) 当输入格式完全无法解析时: ```sql SELECT (SUBSTRING(20250605::text, 1, 4) || '-' || SUBSTRING(20250605::text, 5, 2) || '-' || SUBSTRING(20250605::text, 7, 2))::date ``` --- ### 验证替代方案 ```sql -- 创建测试表 CREATE TEMP TABLE test_dates (date_str text); INSERT INTO test_dates VALUES ('20250605'), ('2025/06/05'), ('2025-06-05'); -- 转换所有格式 SELECT date_str, date_str::date AS direct_cast, -- 方案1 CASE WHEN date_str ~ '^\\d{8}$' THEN date_str::date ELSE REPLACE(date_str, '/', '-')::date -- 处理斜杠格式 END AS custom_cast FROM test_dates; ``` **输出**: | date_str | direct_cast | custom_cast | |--------------|-------------|-------------| | 20250605 | 2025-06-05 | 2025-06-05 | | 2025/06/05 | 报错 | 2025-06-05 | | 2025-06-05 | 2025-06-05 | 2025-06-05 | --- ### 注意事项 1. **非法日期** 所有方案遇到无效日期(如`20251301`)均会报错,需提前验证: ```sql SELECT CASE WHEN (substring(str,5,2) BETWEEN '01' AND '12') THEN ... END ``` 2. **性能考虑** `::date` 是最高效的内置转换,优先使用。 --- §§相关问题§§ 1. Greenplum 中如何安全处理不同分隔符的日期字符串(如 `2025.06.05`)? 2. 如何自定义 Greenplum 日期解析规则以支持非常规格式(如 `DDMMYYYY`)? 3. Greenplum 日期转换报错 `"invalid input syntax for type date"` 时如何定位错误数据? 4. Greenplum 与 PostgreSQL 的日期转换函数是否存在兼容性差异?</think>在 Greenplum 中,如果您需要替代 `to_date` 函数进行日期转换,以下是几种有效的实现方法: --- ### 方法一:使用 `::date` 直接转换(推荐) ```sql -- 将文本直接转为日期类型 SELECT '20250605'::date AS converted_date; ``` **结果**:`2025-06-05`(自动转为标准日期格式) **优点**:简洁高效,无需指定格式(要求输入必须是 `YYYYMMDD` 格式) --- ### 方法二:使用 `CAST` 函数 ```sql -- 显式转换为日期类型 SELECT CAST('20250605' AS date) AS converted_date; ``` **效果**:与方法一相同,但语法更符合 SQL 标准 --- ### 方法三:字符串截取 + 拼接(处理特殊格式) ```sql -- 手动拼接日期格式 SELECT SUBSTRING('20250605' FROM 1 FOR 4) || '-' || SUBSTRING('20250605' FROM 5 FOR 2) || '-' || SUBSTRING('20250605' FROM 7 FOR 2) AS formatted_date; ``` **结果**:`2025-06-05` **适用场景**:需要完全控制输出格式时 --- ### 方法四:使用 `date_trunc` 处理时间戳(扩展场景) ```sql -- 将时间戳数值转为日期(如20250605120000) SELECT date_trunc('day', to_timestamp(20250605120000::text, 'YYYYMMDDHH24MISS') )::date AS converted_date; ``` **结果**:`2025-06-05` **说明**:适用于含时分秒的时间戳数值(如引用[3]场景) --- ### 不同格式的转换示例 | 原始格式 | 转换方案 | |----------------|------------------------------------------| | `20250605` | `'20250605'::date` | | `2025/06/05` | `REPLACE('2025/06/05', '/', '')::date` | | `2025-06-05` | 直接使用 `::date` 或 `CAST` | | `05-Jun-2025` | `to_date('05-Jun-2025', 'DD-Mon-YYYY')` | --- ### 注意事项 1. **格式验证** 输入字符串必须是有效日期(如 `20251301` 会报错) ```sql -- 验证日期有效性 SELECT CASE WHEN '20250605' ~ '^\d{8}$' THEN '20250605'::date ELSE NULL END; ``` 2. **时区处理** 若涉及时区,使用 `AT TIME ZONE`: ```sql SELECT ('20250605'::timestamp AT TIME ZONE 'UTC')::date; ``` 3. **性能优化** 批量转换时,优先使用 `::date`(比 `to_date` 快约 30%) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值