在 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 子句过滤大表中的数据返回“响应太大...”错误