【问题标题】:How to cast varchar to boolean如何将 varchar 转换为布尔值
【发布时间】:2016-10-07 20:32:21
【问题描述】:

我有一个变量“x”,它在临时表中是 varchar,但它在目标表中设置为布尔值,具有“真”和“假”值。如何在 postgresql 中将 varchar 转换为布尔值?

【问题讨论】:

  • 要插入,选择更新吗?还是什么?
  • 我要更新

标签: postgresql postgresql-9.3 postgresql-9.2 postgresql-9.4


【解决方案1】:

如果 varchar 列包含 one of the strings(不区分大小写):

  • t, true, y, yes, on, 1
  • f, false, n, no, off, 0

您可以简单地将其转换为布尔值,例如:

select 'true'::boolean, 'false'::boolean;

 bool | bool 
------+------
 t    | f
(1 row) 

SQLFiddle

【讨论】:

  • 这不是真的,见select 'true'::varchar::boolean, 'false'::varchar::boolean;
  • 这有什么问题?? SQLFiddle
  • 嗯,很有趣。我会发誓我在新的 PostgreSQL 中也看到了错误,但这似乎只是 Redshift 和旧 PostgreSQL 版本中的问题。
  • 确认redshift会抛出select 'true'::varchar::boolean;的错误:无效操作:不能将类型字符转换为布尔值;
【解决方案2】:

对于旧的 PostgreSQL 版本和 Redshift 转换将不起作用,但以下方法可以:

SELECT boolin(textout('true'::varchar)), boolin(textout('false'::varchar));

参见SQLFiddle 也参见PostgreSQL list 上的讨论。

【讨论】:

    【解决方案3】:

    对于 Redshift,我在以下方面获得了最好的运气:

    SELECT DECODE(column_name, 
                 'false', '0', 
                 'true', '1'
                 )::integer::boolean from table_name;
    

    这只是将 varchar 字符串映射到 '0''1',然后 Redshift 可以先将其转换为整数,最后再转换为布尔值。


    这种方法的一大优势是它可以扩展为包含您想要映射的任何其他字符串。即:

        SELECT DECODE(column_name, 
                 'false', '0', 
                 'no', '0', 
                 'true', '1',
                 'yes', '1'
                 )::integer::boolean from table_name;
    

    您可以阅读有关 DECODE 方法here 的更多信息。

    【讨论】:

    • 我似乎不需要中间 ::INTEGER:: 演员表。 SELECT DECODE(col_name, 'N', '0', 'Y', '1' )::BOOLEAN FROM table_name; 在 Redshift 中对我来说工作正常。
    【解决方案4】:

    如果你可以假设除了true 之外的任何东西都是false,那么你可以使用:

    select
      column_name = 'true' column_name_as_bool
    from
      table_name;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2016-01-13
      • 2015-09-27
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多