【问题标题】:Select statement inside Concatenate (Oracle)在 Concatenate (Oracle) 中选择语句
【发布时间】:2015-01-06 21:01:25
【问题描述】:

我在 Oracle 中有复杂的 Select 语句,带有 Case When 条件,它们选择所有 Concatenate 值。 所以类似这样的东西:

END
END
FROM something
...

我需要的是连接其他表中的其他值而不是我的值。 因此,我将拥有(我的价值)而不是:

(Select textValue from textView A where A.textID = '395')

如果我单独运行此语句,它将取出一个我想要的确切值。但是,如果我将它而不是 (My Value) 放入连接中,它会给我错误:ora-00936 missing expression (是的,'395' 是另一个表中的字符串)

有什么想法吗?

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 看起来像 Oracle -- || 是连接运算符。但用 DBMS 标记问题肯定会有所帮助。
  • 是的,抱歉,我更改了 OP。这是甲骨文。
  • 错误是什么?而且,您可以编辑查询并显示实际失败的代码吗?
  • 最糟糕的是我可以在工作中t post the query since its 代码,我不想惹麻烦。查询也很大,我的意思是巨大的。但重要的是在 OP 中我试图实现的目标。这也是错误:ora-00936 缺少表达式

标签: sql oracle concatenation


【解决方案1】:

您可以在 Oracle 的 case 子句中使用内联视图。这不是你想要做的吗? “缺少表达式”错误可能是缺少括号或一些类似的代码错误。

select case object_type
          when 'TABLE' then
             'select * from ' || object_name
          when 'SYNONYM' then
             'describe ' || object_name
          when 'PACKAGE' then
             (select to_char (count (*))
                from user_source s
               where s.type = o.object_type and s.name = o.object_name)
          else
             (select object_type from dual)
       end
          as objects
  from user_objects o

或者简单地创建一个返回函数并为您执行此操作并调用它。

create function gettextval (p_textid in varchar2)
    return varchar2 is
    l_returnval   varchar2 (32767);
begin
    select text_val
      into l_returnval
      from v_texts s
     where s.text_id = p_textid;

    return l_returnval;
exception
    when no_data_found then
        return p_textid;
end;

在这个例子中,我让它返回没有找到的输入字符串。

然后你可以引用你之前选择的函数。

' || gettextval('395') || '

【讨论】:

  • 这是第一个起作用的东西。但它只适用于 ' || (select TO_CHAR (count (*)) from V_TEXTS s where s.TEXT_ID = '395') || ' 它不需要t work when I put the actual column I want instead of TO_CHAR (count (*)) which I dont。
  • 确保将其转换为与其他行返回的数据类型相同的数据类型。例如,在我的示例中,如果您删除“to_char”,SQL 将返回错误,因为所有其他行都返回文本 (varchar2),SQL 引擎不需要数字。
  • ' || (从 V_TEXTS V 中选择 CAST(TEXT_VALUE AS NVARCHAR2(255)),其中 V.TEXT_ID = '395')|| ' 仍然是字符不匹配。现在不知道是什么原因造成的。
  • 如果 to_char(count(*)) 在此之前有效,则结果将被转换为 char 或 varchar2。坚持使用 to_char()。
【解决方案2】:

您可以发布带有“选择文本”位的查询吗?

当用例->当我这样做时:

SELECT
  CASE A.LIST_TYPE_CD
    WHEN '1' THEN '<A HREF="censured?thresholdId=censured' || GET_SITE_SUFFIX() || chr(38) || 'task=runSQL' || chr(38) || 'parseParams=true' || chr(38) || 'list_id=' ||  A.LIST_ID || chr(38) || 'list_name=' || A.LIST_NAME ||
'">' || (Select textValue from textView A where A.textID = '395') || '</A>'
    WHEN '3' THEN '<A HREF=censured' || GET_SITE_SUFFIX() || chr(38) || 'task=runSQL' || chr(38) || 'parseParams=true' || chr(38) || 'list_id=' || A.LIST_ID ||
    '">' || (Select textValue from textView B where B.textID = '395') || '</A>'
END
FROM something A

【讨论】:

  • 是的,我可以使用 conc。即使在那里,虽然现在我得到:ora-12704 字符集不匹配
  • CAST 将选定的textValue 转换为 NVARCHAR。另外,请确保您的小选择只返回一行..
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多