2015-08-11 2 views
2

У меня есть столбец в таблице со следующими значениями:Проверьте последние две цифры алфавитный

часть

1000-001-2211 

1000-001-2211AA 

1000-001-2211AB 

1000-001-2211AQ 

1000-001-2211BI 

Мне нужно специально отобразить последние два символа каждого значения, если они не являются числовыми. Например, мой ожидаемый результат должен быть таким:

часть | last_two_char

1000-001-2211 |   

1000-001-2211AA | AA 

1000-001-2211AB | AB 

1000-001-2211AQ | AQ 

1000-001-2211BI | BI 

Как получить этот вывод, используя запрос SQL?

+2

Вы пробовали where where: WHERE columnname LIKE '% [a-z] [a-z]'? – CLaFarge

+2

Одна из вещей, которая действительно помогает нам помочь вам в том, чтобы включить то, что вы пробовали, и некоторые примеры кода не могут повредить. – CLaFarge

+0

@ Zahoor вы можете использовать ISNUMERIC –

ответ

0

Это должно сработать. Используйте функцию RIGHT, чтобы выбрать буквы справа в столбце. Используйте WHERE, чтобы скорректировать значения.

SELECT RIGHT(column_name, 2) FROM table_name WHERE column_name LIKE '%[a-z][a-z]'

+1

Вот мой запрос ВЫБОР BOM_HEADER , SAP_CAGE_CD , SUBSTR (BOM_HEADER, -2) КАК CONFIG ОТ temp_sap_boms_list_mma_ct4 A , TBITEM B , TBPART P ГДЕ A.ITEM (+) = B.ITEM И P.ITEM = A.ПУНКТ И BOM_HEADER LIKE '022489-054-03%'; И я получаю следующий вывод Bom_header код конфигурации 022489-054-03 022489-054-03AM \t \t 99167 AM 022489-054-03AQ \t \t 99167 AQ 022489-054- 03AU \t \t 99167 AU 022489-054-03AY \t \t 99167 AY 022489-054-03BI \t \t 99167 BI –

+0

ORA-00904: "ПРАВЫЙ": недопустимый идентификатор –

+3

Oracl e не предоставляет функцию «RIGHT» или «LEFT». Вместо этого используйте 'SUBSTR'. 'RIGHT' эквивалентен' SUBSTR (str, -2) '(для получения двух последних символов строки.' LEFT' эквивалентно 'SUBSTR (str, 1, 2)' (чтобы получить первые два символа Струна). –

2
with tab as (select '1000-001-2211AB' col1 from dual 
union 
select '1000-001-2211' col1 from dual) 
select REGEXP_SUBSTR(col1 ,'([[:alpha:]]{2})$') last2_alpha_char from tab; 
1

Один из способов, с помощью SUBSTR, INSTR и TO_NUMBER. Поскольку вы отметили PLSQL.

Это работает. вы можете попробовать это?

Сначала создайте function для проверки строки, переданной в качестве параметра.

CREATE or replace FUNCTION is_number (p_string IN VARCHAR2) 
    RETURN varchar2 
    IS 
    v_new_num varchar2(2000); 
    BEGIN 
    v_new_num := TO_NUMBER(p_string); 
    RETURN NULL; 
    EXCEPTION 
    WHEN VALUE_ERROR THEN 
    RETURN p_string; 
    END is_number; 

-- function created 

Затем используйте любой один из ниже запросов, чтобы получить желаемый результат:

select part,check_part,(part ||' | ' || req_part) As Final_part from 
     (
     select part,(substr(part,-2,instr(part,'-',1,1))) as check_part, 
     IS_NUMBER((substr(part,-2,instr(part,'-',1,1)))) as req_part 
     -- calling IS_NUMBER function 
     from parts 
     ) parts; 

      -- OR 

    select part,check_part,(part ||' | ' || req_part) As Final_part from 
     (
     select part,substr(part,-2,2) as check_part, 
     IS_NUMBER(substr(part,-2,2)) as req_part 
     -- calling IS_NUMBER function 
     from parts 
     ) parts; 

Выход:

PART  CHECK_PART  FINAL_PART 
1000-001-2211  11  1000-001-2211 | 
1000-001-2211AA AA  1000-001-2211AA | AA 
1000-001-2211AB AB  1000-001-2211AB | AB 
1000-001-2211AQ AQ  1000-001-2211AQ | AQ 
1000-001-2211BI BI  1000-001-2211BI | BI 

Тест Скриншот:

output

1

Вы можете попробовать эти простые из них с помощью REGEXP_LIKE

Использование SUBSTR, INSTR с REGEXP_LIKE

Select part || ' | ' || NULL as FINAL_PART 
from parts -- to check number 
where NOT REGEXP_LIKE ((substr(part,-2,instr(part,'-',1,1))), '[a-zA-Z]') 
UNION 
Select part || ' | ' || (substr(part,-2,instr(part,'-',1,1))) 
from parts -- to check aplhabets 
where REGEXP_LIKE ((substr(part,-2,instr(part,'-',1,1))), '[a-zA-Z]') ; 

Использование только SUBSTR с REGEXP_LIKE

Select part || ' | ' || NULL as FINAL_PART 
from parts -- to check number 
where NOT REGEXP_LIKE(substr(part,-2,2), '[a-zA-Z]') 
UNION 
Select part || ' | ' || substr(part,-2,2) 
from parts -- to check aplhabets 
where REGEXP_LIKE(substr(part,-2,2) , '[a-zA-Z]') ; 

Выход:

output tested

1

Ниже Query поможет вам принести нужный результат:

Lets Создать таблицу ниже:

CREATE TABLE chartable(col1 Varchar2(200)); 

Lets вставить значения в него:

insert into chartable values('1000-001-2211BI'); 
insert into chartable values('1000-001-2211AQ'); 
insert into chartable values('1000-001-2211AB'); 
insert into chartable values('1000-001-2211'); 
insert into chartable values('1000-001-2211AA'); 

COMMIT; 

Ниже запроса вы получите требуемый результат:

select out.col1 || '|' || (select substr(col1,-2,2) from chartable ins 
     where ins.col1 = out.col1 AND 
      regexp_like((substr(col1,-2,2)) , '[A-Za-z]{2}')) as part 
FROM chartable out; 

Результат:

part 
1000-001-2211| 
1000-001-2211AA|AA 
1000-001-2211AB|AB 
1000-001-2211AQ|AQ 
1000-001-2211BI|BI 

Здесь SUBSTR funstion поможет вам получать последние два символа.

Затем мы используем функцию REGEXP_LIKE, чтобы проверить, что последние два символа - CHARCACTER.

Смежные вопросы