代码之家  ›  专栏  ›  技术社区  ›  Nick

如何从SQL结果中替换XML中显示的unicode

  •  0
  • Nick  · 技术社区  · 1 年前

    我有以下SQL查询(末尾似乎有某种空格),它在XML输出中返回数据,我试图在SQL的前端将其从XML输出中删除:

    SELECT 'H' KEY , 
    REPLACE(REPLACE(LN.VENDOR_PRODUCT_NUM, CHR(8237), ''), CHR(8236), '') vendor_catalog_number
    
    FROM MyTable
    

    SQL结果 (末尾似乎没有显示空格):

    KEY        vendor_catalog_number
    H       ‭   ‭CUR251636‬
    

    enter image description here

    XML输出:

    <?xml version = '1.0' encoding = 'utf-8'?>
    <DATA_DS>
    <G_1>
    <KEY>H</KEY>
    <VENDOR_CATALOG_NUMBER><0x202d>‭CUR251636‬<0x202c></VENDOR_CATALOG_NUMBER>
    </G_1>
    </DATA_DS>
    

    因此,数据在我的Oracle eText报告模板中呈现为 ?CUR251636? (字符串周围有问号。)

    我还尝试仅使用Linefeeds和Carriage退货,如下所示,但仍然不起作用:

    REPLACE(REPLACE(LN.VENDOR_PRODUCT_NUM, CHR(13)), CHR(10)) vendor_catalog_number
    

    我还可以使用哪些Oracle SQL函数来删除这些空格/unicode字符?

    编辑:

    SELECT DUMP(LN.VENDOR_PRODUCT_NUM, 1016) FROM MyTable
    

    结果:类型=1长度=15字符集=AL32UTF8:e2,80,广告,43,55,52,32,35,31,36,33,36,e2,80

    从MyTable中选择转储(LN.VENDOR_PRODUCT_NUM,1016)
    

    搜索结果:E280AD43552323531363336E280AC

    2 回复  |  直到 1 年前
        1
  •  1
  •   Alex Poole    1 年前

    那些是 POP DIRECTIONAL FORMATTING LEFT-TO-RIGHT OVERRIDE 不知道他们为什么在那里;也许是由于插页上书写系统之间的转换?

    不管怎样。。。似乎你需要AL16UTF16版本的代码点,而不是AL32UTF8版本(不知道为什么,希望别人能解释一下…)。您的代码为 CHR() 不会取代任何东西:

    with cte as (
      SELECT 'H' KEY,
      REPLACE(REPLACE(LN.VENDOR_PRODUCT_NUM, CHR(8237), ''), CHR(8236), '') vendor_catalog_number
      FROM MyTable LN
    )
    select KEY, vendor_catalog_number,
      DUMP(vendor_catalog_number, 1016) as dmp,
      RAWTOHEX(UTL_RAW.CAST_TO_RAW(vendor_catalog_number)) as hex
    from cte
    
    钥匙 供应商目录号 DMP 十六进制
    H CUR251636 类型=1长度=15字符集=AL32UTF8:e2,80,广告,43,55,52,32,35,31,36,33,36,e2,80 e280ad 435552323531363336e280ac

    如果你使用 UNISTR() 功能(或添加 USING NCHAR_CS 选择 CHR() 则它确实替换了这些:

    with cte as (
      SELECT 'H' KEY,
      REPLACE(REPLACE(LN.VENDOR_PRODUCT_NUM, UNISTR('\202d'), null), UNISTR('\202c'), null) vendor_catalog_number
      FROM MyTable LN
    )
    select KEY, vendor_catalog_number,
      DUMP(vendor_catalog_number, 1016) as dmp,
      RAWTOHEX(UTL_RAW.CAST_TO_RAW(vendor_catalog_number)) as hex
    from cte
    
    钥匙 供应商目录号 DMP 十六进制
    H CUR251636 类型=1长度=9字符集=AL32UTF8:43,55,52,32,35,31,36,33,36 435552323531363336

    …只生成您想要的9个字符的字符串 'CUR251636' .

    fiddle

    因此,代替您当前的查询:

    SELECT 'H' KEY , 
    REPLACE(REPLACE(LN.VENDOR_PRODUCT_NUM, CHR(8237), ''), CHR(8236), '') vendor_catalog_number
    FROM MyTable LN
    

    您可以执行以下操作:

    SELECT 'H' KEY,
    REPLACE(REPLACE(LN.VENDOR_PRODUCT_NUM, UNISTR('\202d'), null), UNISTR('\202c'), null) vendor_catalog_number
    FROM MyTable LN
    
        2
  •  -2
  •   marc_s MisterSmith    1 年前

    oracle SQL中有几个oracle函数可以删除空格或不需要的Unicode字符

    TRIM Function
    LTRIM and RTRIM
    REPLACE
    TRANSLATE
    REGEXP_REPLACE 
    

    或者,要删除特定的Unicode字符,如不间断空格(U+00A0),您可以使用:

    前任:

    SELECT REPLACE(column_name, CHR(160), '') AS cleaned_column
    FROM table_name;