[英]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
我想從該查詢中得到的是:
location_name
不包含任何數值,則返回1
location_name
包含數字值,則僅獲取最后一個數字值(在字符串之后),即c2輪播10,應僅返回10
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更改為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
-- 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.