【问题标题】:Selecting Multiple values from one string in SQLSQL从一个字符串中选择多个值
【发布时间】:2016-05-18 17:43:07
【问题描述】:

大家好,我使用的是 Oracle 11。要求是只选择那些我们有“纽约”和“达拉斯”的记录。请注意,具有相同记录的城市的顺序可能会发生变化。所以从下面的记录集中,我应该只有两条记录(即建议 3 和 5)。请注意,来自 City 的值是使用 wm_concat 函数连接的

Rec#    City
1   New York
2   Huston
3   New York;Dallas
4   Los Angles
5   Los Vegas;Dallas;San Dieago;New York
6   Huston;Chicago;Salt Lake City;Cleaveland

【问题讨论】:

    标签: sql string oracle substring


    【解决方案1】:

    我在 Postgres 上写的,因为 oracle fiddle 是错误的,但应该是一样的

    SQL Fiddle Demo

    SELECT *
    FROM cities
    WHERE "City" LIKE '%New York%'
    AND "City" LIKE '%Dallas%'
    

    问题是,如果您尝试搜索 'York' 之类的内容,可能会部分匹配,并且还会找到 'New York',因此您可以这样修复

    SELECT *
    FROM cities
    WHERE "City" LIKE '%York%'; -- will find `New York`
    
    SELECT *
    FROM cities
    WHERE ';' || "City" || ';' LIKE '%;York%;'; -- correct solve
    

    正如@Egor 建议的那样,您可以使用单个LIKE 来做到这一点

    SELECT *
    FROM cities
    WHERE ';' || "City" || ';;' || "City" || ';' LIKE '%;Dallas;%;New York;%' ;
    

    【讨论】:

    • select ... where ';'||city||';;'||city||';' like '%;New York;%;Dallas;%'
    • 我已经进入了我的答案,它允许一个城市可能是另一个城市的一部分或出现在字符串的开头/结尾。如果您的示例处理它,我将删除我的其他评论。
    • @Gary_W 是的,确实如此。:) 两种解决方案
    • @JuanCarlosOropeza - 这是一种只使用一个 LIKE 而不是两个的方法。
    • @EgorSkriptunoff 是的,我现在可以看到了,一开始并不容易阅读:),
    【解决方案2】:

    我不知道 Oracle 语法,但类似这样:

    Select columns where cities like "Dallas" and cities like "New York"

    【讨论】:

    • 那可能只能找到 Rec#1,你需要通配符
    • AND 意味着它必须同时匹配纽约和达拉斯,为什么它只匹配 rec#1 ?
    • 检查 dantella 和我的答案。您需要包含通配符 % 否则只会匹配确切的字符串
    【解决方案3】:

    试试这个

     SELECT * from TABLE_NAME where City like '%New York%Dallas%' or City like '%Dallas%New York%'
    

    【讨论】:

    • 我们可以使用子字符串函数吗?
    【解决方案4】:

    尝试使用 REGEXP_LIKE,其中搜索的城市也可能位于行首或行尾。正则表达式表示搜索的城市以行首或分隔符开头,然后是分隔符或行尾。

    with tbl(rec, city) as (
      select 1, 'New York' from dual union
      select 2, 'Huston' from dual union
      select 3, 'New York;Dallas' from dual union
      select 4, 'Los Angles' from dual union
      select 5, 'Los Vegas;Dallas;San Dieago;New York' from dual union
      select 6, 'Huston;Chicago;Salt Lake City;Cleaveland' from dual union
      select 7, 'Huston;Chicago;Salt Lake City;New York;York' from dual union
      select 8, 'York;Huston;Chicago;Salt Lake City' from dual  
    )
    select rec, city
    from tbl
    where regexp_like(city, '(^|;)York(;|$)')
    and   regexp_like(city, '(^|;)New York(;|$)');
    

    【讨论】:

    • 我包括约克扩大样本,OP问题需要达拉斯
    • 为什么只匹配“York”?根据 OP 的要求,我认为这没有任何好处。
    • 测试可能是另一个城市名称一部分的城市名称。即匹配一个名为“York”但不是“New York”的城市。始终尝试考虑测试数据中的意外情况。
    • 我怀疑 regexp_like 更贵。对您的数据集进行一些计时,看看是否重要。
    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2013-05-20
    • 2013-06-10
    相关资源
    最近更新 更多