sql提取身份证号码

问题描述 投票:0回答:1

嗨,我收到以下案例:

我需要根据情况从每个 ID 格式中提取正确的数字

  1. 09N 0720001536 应清洁至:97201536
  2. 08N 0798001682 应清洁至:87981682
  3. 08NT0184001825 应清洁至:81841825
  4. 05NT0702001350 应清洁至:57021350
  5. 08 0732001283 应清洁至:87321283
  6. 00E 0008138007 应清洁为:E8138007
  7. 10 0732001283 应清洁至:107321283
  8. 10N 0798001682 应清洁至:107981682
  9. 10NT0702001350 应清洁为:107021350

除了 6.00E 0008138007 之外的所有情况均应清洁为:E8138007,现在清洁为 E813800,因此剩下最后一个数字,我不确定我在 SP 中做错了什么,因为我正确地看到了它,知道什么我失踪了?

谢谢你

CREATE OR REPLACE PROCEDURE AGAITAN_PROCESAR_CEDULA (
    p_cedula IN VARCHAR2,
    p_resultado OUT VARCHAR2
) AS
    v_provincia VARCHAR2(2);
    v_bloque3 VARCHAR2(4);
    v_bloque4 VARCHAR2(6);
    v_cedula_limpia VARCHAR2(20);
BEGIN
    -- Paso 1: Limpiar la cédula, manteniendo solo números y la letra 'E'
    v_cedula_limpia := REGEXP_REPLACE(p_cedula, '[^0-9E]', '');

    -- Paso 2: Extraer la provincia
    v_provincia := SUBSTR(v_cedula_limpia, 1, 2);

    -- Paso 3: Extraer los bloques
    v_bloque3 := SUBSTR(v_cedula_limpia, 3, 4);  -- Tercer bloque (dígitos 3 a 6)
    v_bloque4 := SUBSTR(v_cedula_limpia, 7, 6);  -- Cuarto bloque (dígitos 7 a 12)

    -- Paso 4: Manejo de casos específicos
    IF v_cedula_limpia LIKE '00E%' THEN
        -- Caso especial: Si la cédula es de tipo '00E'
        p_resultado := 'E' || LTRIM(v_bloque4, '0');  -- Mantener la letra E y limpiar el bloque 4
    ELSE
        -- Limpiar ceros a la izquierda en la provincia
        v_provincia := LTRIM(v_provincia, '0');

        -- Limpiar ceros a la izquierda en los bloques
        v_bloque3 := LTRIM(v_bloque3, '0');
        v_bloque4 := LTRIM(v_bloque4, '0');

        -- Formar la cédula limpia
        p_resultado := v_provincia || v_bloque3 || v_bloque4;
    END IF;

    -- Asegurarse de que el resultado no esté vacío
    IF p_resultado IS NULL OR p_resultado = '' THEN
        p_resultado := '0';  -- O un mensaje adecuado
    END IF;

EXCEPTION
    WHEN OTHERS THEN
        p_resultado := NULL; -- En caso de error, devolver NULL
END AGAITAN_PROCESAR_CEDULA;
/

案例 6. 00E 0008138007 应清洁为:E8138007,现在清洁为 E813800

sql oracle
1个回答
0
投票

尝试 SUBSTR(v_cedula_limpia, 7, 7)。这应该可以帮助您从第 4 个区块中获得 7 位数字。

© www.soinside.com 2019 - 2024. All rights reserved.