簡體   English   中英

在SQL上僅選擇數值

[英]select only numeric values on 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. 如果location_name包含數字值,則僅獲取最后一個數字值(在字符串之后),即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中執行此操作?

試試這個:(我認為它將返回預期的結果。否則記下您得到的結果。)

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

-快速演示在這里: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

-快速演示-PGSQL。

-- 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM