根据匹配 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 条件中的子字符串来选择值的主要内容,如果未能解决你的问题,请参考以下文章