GBase 8s数据类型boolean与int转换写法(临时使用)

GBase 8s数据库的boolean类型取值为:'t','f',null。其它数据库可接受对应的1,0,null的数值写法。为了兼容使用,可临时自定义转换及等值及不等值操作函数的方式实现兼容。

以下为自定义转换,及等值(equal)及不等值(notequal)函数写法示例:

SET environment sqlmode 'gbase';
DROP FUNCTION IF EXISTS int2boolean(int);
-- 允许接受空值
CREATE FUNCTION int2boolean(p1 int)
RETURNS boolean WITH (NOT variant);
  IF p1 = 0 THEN 
    RETURN 'f';
  ELIF p1 IS NULL THEN 
    RETURN NULL;
  END IF;
  RETURN 't';
END FUNCTION;

DROP CAST IF EXISTS(int as boolean);
-- 创建转换:int转换为boolean,使用int2boolean函数;
CREATE implicit CAST IF NOT EXISTS (int AS boolean WITH int2boolean);

DROP FUNCTION IF EXISTS equal(boolean,int);
-- 两个参数需转换为第三类数据类型,否则可能带来递归。
CREATE FUNCTION equal(p1 boolean, p2 int)
RETURNS boolean WITH (NOT variant);
  DEFINE v_p1 CHAR(1);
  DEFINE v_p2 CHAR(1);
  LET v_p1 = CAST(p1 AS CHAR);
  LET v_p2 = CAST(p2 AS CHAR);
  IF (v_p1 IN ('t','1') AND v_p2 IN ('t','1')) 
      OR (v_p1 IN ('f','0') AND v_p2 IN ('f','0')) THEN 
    RETURN 't';
  ELSE
    RETURN 'f';
  END IF;
END FUNCTION;

DROP FUNCTION IF EXISTS notequal(boolean,int);
CREATE FUNCTION notequal(p1 boolean, p2 int)
RETURNS boolean WITH (NOT variant);
  DEFINE v_p1 CHAR(1);
  DEFINE v_p2 CHAR(1);
  LET v_p1 = CAST(p1 AS CHAR);
  LET v_p2 = CAST(p2 AS CHAR);
  IF (v_p1 IN ('t','1') AND v_p2 IN ('f','0')) 
      OR (v_p1 IN ('f','0') AND v_p2 IN ('t','1')) THEN 
    RETURN 't';
  ELSE
    RETURN 'f';
  END IF;
END FUNCTION;

DROP FUNCTION IF EXISTS equal(int,boolean);
CREATE FUNCTION equal(p2 int,p1 boolean)
RETURNS boolean WITH (NOT variant);
  RETURN equal(p1,p2);
END FUNCTION;

DROP FUNCTION IF EXISTS notequal(int,boolean);
CREATE FUNCTION notequal(p2 int,p1 boolean)
RETURNS boolean WITH (NOT variant);
  RETURN notequal(p1,p2);
END FUNCTION;

测试示例:

CREATE TABLE tabbool(col1 int, col2 boolean);
INSERT INTO tabbool values(1,1),(2,0),(3,-1),(4,null);
SELECT * FROM tabbool;
SELECT * FROM tabbool WHERE 0 != col2;
SELECT * FROM tabbool WHERE col2 = 0;
SELECT * FROM tabbool WHERE col2 is null;

标签: GBase, 南大通用, boolean, 转换

添加新评论