【问题标题】:Selecting a value based on matching the substring in where condition根据匹配 where 条件中的子字符串来选择值
【发布时间】: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' 而不是两者

提前致谢

【问题讨论】:

  • 考虑规范化你的数据

标签: oracle


【解决方案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 属性,建议的设计会帮助您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      相关资源
      最近更新 更多