【问题标题】:How to get all matching text of IN operator in SQL?如何在 SQL 中获取 IN 运算符的所有匹配文本?
【发布时间】:2017-05-02 08:26:56
【问题描述】:

要清楚,这里是场景:我正在执行如下查询:

SELECT * FROM table_name WHERE uid IN ( 1, 3, 5, 8, 23, 4, 589 ... )

uids 的列表来自用户。

有没有办法使用 SQL 获取列表中所有匹配的 uids?

我正在寻找Oracle SQL语法,但我也想知道常见数据库系统的语法。

谢谢。

更新

我想得到 所有匹配 uids。比如表中没有uid为823的记录,输出应该是1,3,5,4,589...

【问题讨论】:

  • 您的问题不清楚,因为您编写的查询似乎正是您所要求的。请添加示例输入和所需的输出。
  • 我认为被问到的问题就像来自SELECT * FROM table_name WHERE uid IN ( 1, 3, 5, 8, 23, 4, 589 ... ) union SELECT * FROM table_name WHERE uid like '1%' union SELECT * FROM table_name WHERE uid like '3%' 等等的所有结果。 @JCA_Amellar 我说的对吗?
  • 简化(缩短 IN 列表),添加示例表数据并指定预期结果 - 以及格式化文本。
  • 你选择这样做,你在看什么

标签: sql oracle in-operator


【解决方案1】:

有没有办法使用 SQL 获取列表中所有匹配的 uid?

是的,使用您的查询,但只需获取 uid 列。如果您不想重复,请使用 DISTINCT 关键字:

SELECT DISTINCT uid
FROM   table_name
WHERE  uid IN ( 1, 3, 5, 8, 23, 4, 589 ... )

如果您希望它在逗号分隔的列表中:

SELECT LISTAGG( uid, ',' ) WITHIN GROUP ( ORDER BY uid ) AS uids
FROM   table_name
WHERE  uid IN ( 1, 3, 5, 8, 23, 4, 589 ... )

【讨论】:

    【解决方案2】:

    我注意到我正确理解了您的问题。 如果你想知道,给定一个值列表,表中的值是什么,哪些不是,你可以试试这个;您需要回答您在临时表中查找的值(或选择联合子句或类似的东西),然后对您的表进行左连接(这里是您的表)。此脚本是为 MSSQL 提供的。应该很容易将它们转换为 Oracle,如果此解决方案是您所要求的(从您的问题中不清楚)。

    CREATE TABLE TX (UID INT)
    INSERT INTO TX VALUES (1),(5),(4)
    
    CREATE TABLE TEMP1 (ID_VAL INT)
    INSERT INTO TEMP1 SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 5 UNION ALL SELECT 8 UNION ALL SELECT 23 UNION ALL SELECT 4 UNION ALL SELECT 589 
    
    SELECT * FROM TEMP1
    
    SELECT * 
    FROM TEMP1
    LEFT JOIN TX ON TEMP1.ID_VAL = TX.UID
    

    输出:

    ID_VAL      UID
    ----------- -----------
    1           1
    3           NULL
    5           5
    8           NULL
    23          NULL
    4           4
    589         NULL
    

    【讨论】:

    • 您的 DML 语句不是有效的 Oracle 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多