根据匹配 where 条件中的子字符串来选择值

Posted

技术标签:

【中文标题】根据匹配 where 条件中的子字符串来选择值【英文标题】:Selecting a value based on matching the substring in where condition 【发布时间】:2014-02-13 04:29:49 【问题描述】:

我有一个名为 country 的表,其列如下所示

countryname  statename 

 USA         TEXAS
INDIA        DELHI,MAHARASHTRA
ENGLAND      KENT

我想通过将statename 作为参数传递给存储函数来选择国家/地区名称。 但是对于 India 的情况,statename 有多个值,由 ',' 分隔

如何将 where 条件放在 select 中,以便我将 countryname 设为 INDIA,但传递的参数是 'DELHI' 或 'MAHARASHTRA' 而不是两者

提前致谢

【问题讨论】:

考虑规范化你的数据 【参考方案1】:

为什么不使用 LIKE?

例如,你这样做:

DECLARE @stateName VARCHAR(MAX) = 'MAHARASHTRA';

SELECT countryName
FROM table
WHERE (',' || stateName || ',') LIKE '%,' || @stateName || ',%'

【讨论】:

@peterm:因为我在匹配之前将逗号附加到任一端,所以应该可以处理缺少前导和尾随逗号的问题 另一种(类似的)方法是:WHERE INSTR(','||table.stateName||',',','||:stateName||',')>0【参考方案2】:

使用此查询并让我们知道结果

WITH country(countryname,statename ) AS (
SELECT 'USA','TEXAS' FROM dual UNION ALL
SELECT 'INDIA','DELHI,MAHARASHTRA' FROM dual UNION ALL
SELECT 'ENGLAND','KENT' FROM dual)
----------
--- End of data preparation
----------
SELECT countryname 
from (SELECT countryname, regexp_substr(statename, '[^,]+', 1, level) statename
        FROM country
       CONNECT BY regexp_substr(statename, '[^,]+', 1, LEVEL) IS NOT NULL
         AND PRIOR statename = statename
         AND PRIOR sys_guid() IS NOT NULL)
where statename = 'MAHARASHTRA';

输出

| COUNTRYNAME |
|-------------|
|       INDIA |

【讨论】:

【参考方案3】:

鉴于您已决定使用 RDBMS,您应该对数据进行规范化。

建议的设计是有

COUNTRY     STATE
INDIA       DELHI
INDIA       MAHARASHTRA
USA         TEXAS

当您的数据变大时,假设您通过提供州名继续搜索,您将索引 STATE 属性,建议的设计会帮助您。

【讨论】:

以上是关于根据匹配 where 条件中的子字符串来选择值的主要内容,如果未能解决你的问题,请参考以下文章

在pyspark中加入2个表,多个条件,左连接?

在 C# 中的列表内过滤 - 根据 where 条件选择

40 python 正则表达式 match方法匹配字符串 使用search函数在一个字符串中查找子字

Linq Where 条件匹配数组

使用 Linq 的 Where 子句中的子字符串

mysql'WHERE'条件中的列号