2014-12-11 5 views
0

Я знаю, что уже есть некоторые из тех же вопросов, но это меня сбивает с толку.выберите только числовые значения на sql

У меня есть этот запрос:

SELECT 
    CASE 
    WHEN COALESCE(substring(location_name FROM '[0-9]+'), location_name) != '' 
    THEN COALESCE(substring(location_name FROM '[0-9]+'), location_name) 
    ELSE '1' 
END AS sequence 
FROM LOCATION 

То, что я хотел бы получить от этого запроса является:

  1. Если location_name не содержит каких-либо числовых значений, а затем вернуть 1
  2. Если содержит числовые значения, получите только последние числовые значения (после строки), т.е. c2 карусель 10, должен возвращать только 10
  3. Если location_name содержит только числовые значения, а затем возвращают 1

Но что я получаю что-то вроде:

location_name expected result  what I get 
            using [0-9]   using [0-9]+ 
carousel 1  1     1     1 
carousel 2  2     2     2 
carousel 3  3     3     3 
carousel 12  12     1     12 
bottom banner 1     bottom banner  bottom banner 
c2 carousel 1 1     2     2 
c2 carousel 3 3     2     2 
59977   1     5     59977 

Можно ли это сделать в SQL Server?

+0

mysql 'regex' return only' Boolean' вы не можете заменить/фильтровать текст с помощью регулярного выражения, вы должны создать собственную функцию манипуляции с строкой для извлечения результата – Girish

+0

Выглядит честно, как http://stackoverflow.com/q/5651949/ 4099598. –

+0

Взгляните на мой ответ. Я думаю, это именно то, что вы хотите. – Veera

ответ

1

Попробуйте это: (я думаю, что он будет возвращать ожидаемый результат Else сделать отметку, что вы получите..)

SELECT location_name, 
CASE WHEN concat('',location_name * 1) = location_name THEN 
    1 
WHEN concat('',reverse(substring_index(reverse(location_name), ' ', 1)) * 1) = reverse(substring_index(reverse(location_name), ' ', 1)) THEN 
    reverse(substring_index(reverse(location_name), ' ', 1)) 
ELSE 
    1 
END AS EXPECTED_RESULT 
FROM YourTable 

--Quick Demo here:MySQL

Это не хорошо, когда вы вдруг изменили тег MySql к PgSQL. Все мои работы потерялись.

Вот код PgSQL:

Создать функцию для проверки isdigit():

create function isdigits(text) returns boolean as ' 
select $1 ~ ''^(-)?[0-9]+$'' as result 
' language sql; 

Тогда вот код:

SELECT location_name, 
     CASE WHEN isdigits(location_name) = true THEN 1 
      WHEN isdigits(substr(location_name, length(regexp_replace(location_name, '\\s\\S+$', '')) + 2)) = true THEN 
       substr(location_name, length(regexp_replace(location_name, '\\s\\S+$', '')) + 2)::int 
      ELSE 1 
     END AS Result 
    FROM YourTable 

--Quick Demo - PGSQL.

+0

Ничего себе это здорово, но почему я получаю 'СОВЕТ: никакая функция не соответствует указанному имени и типам аргументов. Возможно, вам придется добавить явные типы cast'' (это указывает на REVERSE)? –

+0

btw Я создал скрипку в postgresql: http://www.sqlfiddle.com/#!11/d6a27/2 –

+0

Я изменил свой ответ на PgSQL и добавил ссылку на демо. – Veera

0
-- Create one function first which will help to check wether value is numeric or not 

CREATE FUNCTION mysql_IsNumeric(val TEXT) RETURNS int(11) 
RETURN val REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

--create function that return numeric values only  
CREATE FUNCTION mysql_NumericOnly(val TEXT) RETURNS text CHARSET latin1 
BEGIN 
DECLARE idx INT DEFAULT 0; 
IF mysql_IsNumeric(val) = 0 THEN 
IF ISNULL(val) THEN RETURN NULL; END IF; 
IF LENGTH(val) = 0 THEN RETURN ""; END IF; 
SET idx = LENGTH(val); 
WHILE idx > 0 DO 
IF strcmp(SUBSTRING(val,idx,1),'.')!=0 and mysql_IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN 
SET val = REPLACE(val,SUBSTRING(val,idx,1),""); 
SET idx = LENGTH(val)+1; 
END IF; 
SET idx = idx - 1; 
END WHILE; 
END IF; 
RETURN val; 
END; 


select *, 
case when mysql_IsNumeric(location_name)=1 then 1 
case when location_name!=mysql_NumericOnly(location_name) THEN 
mysql_NumericOnly(Reverse(Left(REVERSE(location_name),INSTR(REVERSE(location_name),' '))) 
    else 1 end as reselut  
    from YourTable 
+0

OP переключил теги с mysql на postgresql, поэтому я не думаю, что ваши ответы применяются больше. –