即使不是set,NULLIF也不支持set arguments error

时间:2015-04-08 05:53:08

标签: postgresql

array_to_string正在返回text(916-555-1212),但即使使用explicit :: text强制转换,postgresql也会将其视为set-operation。

select nullif(
  array_to_string( 
    regexp_matches('9165551212', '(\d{3})?(\d{3})(\d{4})')::text[]
    ,'-')::text
  , '');
ERROR:  NULLIF does not support set arguments

但我可以使用char_length,它需要文本并且可以正常工作

select char_length(
  array_to_string( 
    regexp_matches('9165551212', '(\d{3})?(\d{3})(\d{4})')::text[]
  ,'-')::text
)
 char_length 
-------------
      12

甚至在nullif和同样的错误中包装它

select nullif(
  char_length(
    array_to_string( 
      regexp_matches('9165551212', '(\d{3})?(\d{3})(\d{4})')::text[]
    ,'-')::text
  )
  ,12)
ERROR:  NULLIF does not support set arguments

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,似乎与regexp_matches函数有关:

select nullif(          (regexp_matches( '123', '(2)' )        )[1]      , '' )
;  -- ERROR: NULLIF does not support set arguments
select nullif(          (regexp_matches( '123', '(2)' )::text[])[1]::text, '' )
;  -- ERROR: NULLIF does not support set arguments
select nullif( ( select (regexp_matches( '123', '(2)' )        )[1]     ), '' )
;  -- ok: gives "2"

所以将结果包装在子选择中似乎也解决了这个问题: - /

答案 1 :(得分:0)

很奇怪......如果你做的话,它可以工作

select 
  nullif(
   (
     select array_to_string( 
       regexp_matches(
         '9165551212',
         '(\d{3})?(\d{3})(\d{4})'
       )::text[]
       , '-' )
   )
   , '')