在 Where 子句中选择不返回数据

Posted

技术标签:

【中文标题】在 Where 子句中选择不返回数据【英文标题】:Select within Where Clause returns no data 【发布时间】:2019-07-31 19:44:53 【问题描述】:

我正在尝试在 Where 子句中使用此 Select:

select s.machine 
from gv$session s 
where s.sid = (select  to_number(sys_context('USERENV','SID')) SID 
               from dual)

当我单独执行它时,它返回 'DHAS\TI07',但在 where 子句中

SELECT reg.MAQUINA 
FROM REG_MAQUINA reg 
WHERE to_char('DHAS\'||reg.MAQUINA) = (select s.machine 
                                       from gv$session s 
                                       where s.sid = (select  to_number(sys_context('USERENV','SID')) SID 
                                                      from dual))

不带任何行,问题是如果我在第二个查询中用硬编码结果'DHAS\TI07' 替换选择,它可以工作

【问题讨论】:

s.sid = (select to_number(sys_context('USERENV','SID')) SID from dual)可以简化为s.sid = to_number(sys_context('USERENV','SID') 试过:DECLARE v_maq VARCHAR2(64); v_qam VARCHAR2(64);开始 --QUERY 1 select s.machine INTO v_maq from gv$session s where s.sid = to_number(sys_context('USERENV','SID')) AND ROWNUM = 1; --给出输出 - 'FEDL01' DBMS_OUTPUT.PUT_LINE(v_maq); - 结尾; --QUERY 2 SELECT UNIQUE reg.MAQUINA INTO v_qam FROM DBAMV.REG_MAQUINA reg WHERE to_char('DHAS\'||reg.MAQUINA) = v_maq; DBMS_OUTPUT.PUT_LINE(v_qam);结尾; --------------- ORA-01403: 未找到数据 ORA-06512: 在第 14 行 不要将代码放入 cmets。 edit你的问题 我怀疑空格字符是从内部选择返回的。尝试:select '>'||s.machine||' 【参考方案1】:

GV$SESSION 中的 machine 返回 - 客户端计算机的操作系统名称。这可能包括域名(如果存在)。

因此,当我尝试从同一台机器上的 SQL Developer 和 SQLPlus 执行它时,它给了我不同的结果。

-- Query

SELECT
    S.MACHINE
FROM
    GV$SESSION S
WHERE
    S.SID = (
        SELECT
            TO_NUMBER(SYS_CONTEXT('USERENV', 'SID')) SID
        FROM
            DUAL
    );

-- Result in SQL Developer
-- domain name not present
MACHINE                                                         
----------------------------------------------------------------
ATPL-LAP-18



-- Result in SQLPlus
-- domain name present
MACHINE
----------------------------------------------------------------
WORKGROUP\ATPL-LAP-18

最终,您需要从 GV$SESSION 的机器列中删除机器的域名,因为您将唯一的机器名称存储在表 REG_MAQUINA 中。然后,您可以将此查询与任何工具一起使用。

你可以试试这个查询:

SELECT
    REG.MAQUINA
FROM
    REG_MAQUINA REG
WHERE
    TO_CHAR(REG.MAQUINA) = (
        SELECT
            REPLACE(S.MACHINE,'DHAS\','')
        FROM
            GV$SESSION S
        WHERE
            S.SID = (
                SELECT
                    TO_NUMBER(SYS_CONTEXT('USERENV', 'SID')) SID
                FROM
                    DUAL
            )
    );

干杯!!

【讨论】:

select ... from dual 完全没用(在原始查询中) 是的,@a_horse_with_no_name,我完全理解。但是,我不想更改原始查询。我也看到了你对问题的评论,你是完全正确的。 感谢您的耐心,尝试了最后一个,但仍然没有结果 我也做了 ">'||s.machine||'

以上是关于在 Where 子句中选择不返回数据的主要内容,如果未能解决你的问题,请参考以下文章

如何为'where'子句中的项目返回一些默认值,这些项目在数据库表列中不匹配(不存在)

where 子句中带有字符的整数字段返回奇怪的输出

MySQL-过滤数据(WHERE语句)

使用 where 子句过滤大表中的数据返回“响应太大...”错误

具有多个 where 子句的选择查询在一个结果表中返回多个结果行?

Sql Server:比较where子句中的varchar类型值不返回结果