AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 170579
Accepted
l.lijith
l.lijith
Asked: 2017-04-10 23:36:17 +0800 CST2017-04-10 23:36:17 +0800 CST 2017-04-10 23:36:17 +0800 CST

在 LIKE 运算符中选择多个值

  • 772

我有一个下面给出的 SQL 查询,我想使用like运算符选择多个值。

我的查询正确吗?

SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
FROM       employee
INNER JOIN employee_mdata_history 
ON         employee.ident=employee_mdata_history.employee_ident 
WHERE      employee_id like 'emp1%' , 'emp3%' 
ORDER BY   rx_dt desc

如果没有,有人可以纠正我吗?

我的表有大量以'emp1'and开头的数据'emp3'。我可以根据前 3 个“emp1”和前 2 个“emp3”过滤结果rx_dt吗?

sql-server sql-server-2008
  • 5 5 个回答
  • 344132 Views

5 个回答

  • Voted
  1. Best Answer
    Andriy M
    2017-04-11T03:25:02+08:002017-04-11T03:25:02+08:00

    或者,您可以尝试以下方法:

    SELECT
      x.*
    FROM
      (
        VALUES
          ('emp1%', 3),
          ('emp3%', 2)
      ) AS v (pattern, row_count)
      CROSS APPLY
      (  -- your query
        SELECT top (v.row_count)
                   employee_id, employee_ident, utc_dt, rx_dt 
        FROM       employee
        INNER JOIN employee_mdata_history
        ON         employee.ident=employee_mdata_history.employee_ident 
        WHERE      employee_id like v.pattern
        ORDER BY   rx_dt desc
      ) AS x
    ;
    

    行构造函数将VALUES您的模式列表表示为一个表格,另外为每个模式提供要为该模式检索的行数。CROSS APPLY 运算符将您的查询应用于模式列表的每一行,即每个模式,将每个模式的行数限制为模式列表中的相应值。

    作为旁注,请让我借此机会建议您始终使用从两个或多个表读取的查询中的表别名来限定列。这使您的查询更易于阅读/理解。您始终可以使用短别名来避免重复可能很长的表名。例如:

    SELECT TOP (1)
      e.employee_id,
      h.employee_ident,
      ...
    FROM
      dbo.employee AS e
      INNER JOIN dbo.employee_mdata_history AS h
        ON e.ident = h.employee_ident
    WHERE
      e.employee_id LIKE ...
    ORDER BY
      ...
    
    • 26
  2. McNets
    2017-04-10T23:44:39+08:002017-04-10T23:44:39+08:00

    您应该使用 OR/AND 条件:

    SELECT TOP (1) 
               employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    INNER JOIN employee_mdata_history 
    ON         employee.ident = employee_mdata_history.employee_ident 
    WHERE      employee_id like 'emp1%' 
    OR         employee_id like 'emp3%' 
    ORDER BY   rx_dt desc;
    

    查看 MS-Docs 上的OR (Transact-SQL)。

    我已经建立了一个例子:

    create table employees(employee_id varchar(10), employee_name varchar(100));
    
    insert into employees values
    ('emp10', 'Bryan Nelson'),
    ('emp12', 'Rosalyn Sanders'),
    ('emp13', 'Rose Tudler'),
    ('emp20', 'Julio Gomez'),
    ('emp30', 'Ian McGregor'),
    ('emp40', 'Anne Hatt');
    GO
    
    SELECT employee_id, employee_name
    FROM   employees
    WHERE  employee_id LIKE 'emp1%'
    OR     employee_id LIKE 'emp3%';
    GO
    
    员工编号 | 员工姓名  
    :------------ | :--------------
    emp10 | 布莱恩·纳尔逊   
    emp12 | 罗莎琳·桑德斯
    emp13 | 罗斯·塔德勒    
    emp30 | 伊恩·麦格雷戈   
    

    请记住,您使用的是 TOP 1,无论您使用多少个条件,您都将获得最多一行。

    SELECT TOP 1 employee_id, employee_name
    FROM   employees
    WHERE  employee_id LIKE 'emp1%'
    OR     employee_id LIKE 'emp3%';
    GO
    
    员工编号 | 员工姓名
    :------------ | :------------
    emp10 | 布莱恩·纳尔逊
    

    如果您需要 TOP (X) 行WHERE employee_id LIKE 'emp1%'加上 TOP (X) 行WHERE employee_id LIKE 'emp3%',您可以使用两个与 UNION ALL 连接的 select 语句。

    SELECT TOP 3 employee_id, employee_name
    FROM   employees
    WHERE  employee_id LIKE 'emp1%'
    UNION ALL
    SELECT TOP 1 employee_id, employee_name
    FROM   employees
    WHERE  employee_id LIKE 'emp3%'
    GO
    
    员工编号 | 员工姓名  
    :------------ | :--------------
    emp10 | 布莱恩·纳尔逊   
    emp12 | 罗莎琳·桑德斯
    emp13 | 罗斯·塔德勒    
    emp30 | 伊恩·麦格雷戈   
    

    此外,我将添加模式搜索,但此解决方案返回与模式匹配的所有记录:LIKE 'emp[13]%'

    SELECT employee_id, employee_name
    FROM   employees
    WHERE  employee_id LIKE 'emp[13]%'
    GO
    
    员工编号 | 员工姓名  
    :------------ | :--------------
    emp10 | 布莱恩·纳尔逊   
    emp12 | 罗莎琳·桑德斯
    emp13 | 罗斯·塔德勒    
    emp30 | 伊恩·麦格雷戈   
    

    dbfiddle在这里

    • 14
  3. Lennart - Slava Ukraini
    2017-04-11T02:54:59+08:002017-04-11T02:54:59+08:00

    我猜你想要 1 行where employee_id like 'emp1%'和另一个where employee_id like 'emp3%'. 实现此目的的一种方法是使用union:

    SELECT t1.*
    FROM
      ( SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
        FROM       employee
        JOIN employee_mdata_history 
            ON employee.ident=employee_mdata_history.employee_ident 
        WHERE employee_id like 'emp1%'
        ORDER BY rx_dt desc
      ) AS t1
    UNION ALL
    SELECT t2.*
    FROM
      (  SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
        FROM       employee
        JOIN employee_mdata_history 
            ON employee.ident=employee_mdata_history.employee_ident 
        WHERE employee_id like 'emp3%'
        ORDER BY rx_dt desc
      ) AS t2 ;
    

    由于保证联合中的腿是不相交的UNION ALL,因此可以使用 a ,与仅使用 a 相比,这可能是性能优势UNION。

    我相信 SQL-server 2008 支持像 row_number() 这样的窗口函数,所以你可以使用类似的东西:

    SELECT employee_id, employee_ident, utc_dt, rx_dt
    FROM (
        SELECT employee_id, employee_ident, utc_dt, rx_dt
          , row_number() over (partition by substring(employee_id,1,4)
                               order by rx_dt desc) as rn 
        FROM employee
        JOIN employee_mdata_history 
            ON employee.ident = employee_mdata_history.employee_ident 
        WHERE employee_id like 'emp1%' 
           OR employee_id like 'emp3%'
    ) as T 
    WHERE rn = 1 
    ORDER BY rx_dt desc;
    
    • 4
  4. Davide Greco
    2020-07-27T04:27:43+08:002020-07-27T04:27:43+08:00

    这是一个很好的论据。如果您需要字符串的所有单词出现在表格的字段中,您可以使用下面找到的选择。该查询使用 PATINDEX 语句,如您所知,该语句仅在字符串中的单词与搜索字段的顺序相同时才有效。实际上,PATINDEX 的两个段是先排序后聚合的。前提是存在一个表函数(splitstring_ex),它返回一个记录列表......因此是一个微不足道的拆分。

    select 
    PATINDEX(
        (
            select '%'+STRING_AGG(z.myvalue,'%')+'%' 
            from (
                    select top 100
                        [name] as myvalue
                    from 
                        dbo.splitstring_ex('JKK ABC ZGT', ' ') 
                    order by
                        [name]
                ) as z
        )
        ,(
            select STRING_AGG(z.myvalue,' ')
            from (
                    select top 100
                        [name] as myvalue
                    from 
                        dbo.splitstring_ex('AAK JKK ZGT ABC MKI', ' ') 
                    order by
                        [name]
                ) as z
        )
    ) 
    
    • 0
  5. Ashmita Jain
    2017-04-11T02:24:54+08:002017-04-11T02:24:54+08:00

    您正在使用TOP(1)andorder by子句。因此,您将仅获得该子句排序的第一个顶级记录。

    • -2

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve