* [pgsql] Use "IF" insteal of IF.

This commit is contained in:
朱金勇
2025-12-28 21:23:01 +08:00
parent 386082baba
commit d10e96a387
3 changed files with 78 additions and 28 deletions
+22
View File
@@ -45,3 +45,25 @@ BEGIN
-- 返回res
RETURN res;
END FIND_IN_SET;
/
CREATE OR REPLACE FUNCTION "IF"(
p_condition BOOLEAN, -- 判断条件
p_true_val ANYTYPE, -- true分支返回值(任意类型)
p_false_val ANYTYPE -- false分支返回值(任意类型)
) RETURNS ANYTYPE
AS
BEGIN
-- 仅校验条件非空,不校验类型
IF p_condition IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, '判断条件不能为NULL');
END IF;
-- 核心逻辑:直接返回不同类型值
IF p_condition THEN
RETURN p_true_val; -- 如:字符串
ELSE
RETURN p_false_val; -- 如:数值
END IF;
END;
/
+54 -6
View File
@@ -256,7 +256,7 @@ END;
$$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION IF(
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val BOOLEAN,
false_val BOOLEAN
@@ -272,7 +272,7 @@ $$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION IF(
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val DOUBLE PRECISION,
false_val INTEGER
@@ -288,7 +288,55 @@ $$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION IF(
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val DOUBLE PRECISION,
false_val DOUBLE PRECISION
) RETURNS DOUBLE PRECISION AS $$
BEGIN
IF condition THEN
RETURN true_val;
ELSE
RETURN false_val;
END IF;
END;
$$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val TEXT,
false_val TEXT
) RETURNS TEXT AS $$
BEGIN
IF condition THEN
RETURN true_val;
ELSE
RETURN false_val;
END IF;
END;
$$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val INTEGER,
false_val INTEGER
) RETURNS INTEGER AS $$
BEGIN
IF condition THEN
RETURN true_val;
ELSE
RETURN false_val;
END IF;
END;
$$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val TEXT,
false_val DATE
@@ -304,7 +352,7 @@ $$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION IF(
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val DATE,
false_val DATE
@@ -320,7 +368,7 @@ $$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION IF(
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val timestamp without time zone,
false_val DATE
@@ -336,7 +384,7 @@ $$ LANGUAGE plpgsql;
--
CREATE OR REPLACE FUNCTION IF(
CREATE OR REPLACE FUNCTION "IF"(
condition BOOLEAN,
true_val timestamp without time zone,
false_val timestamp without time zone
+2 -22
View File
@@ -606,28 +606,7 @@ class dbh
if(stripos($sql, 'CREATE OR REPLACE VIEW ') === 0)
{
// Modify if function.
$fieldsBegin = stripos($sql, 'select');
$fieldsEnd = stripos($sql, 'from');
$fields = substr($sql, $fieldsBegin+6, $fieldsEnd-$fieldsBegin-6);
$fieldList = preg_split("/,(?![^(]+\))/", $fields);
foreach($fieldList as $key => $field)
{
$aliasPos = stripos($field, ' AS ');
$subField = substr($field, 0, $aliasPos);
if(stripos($field, 'SUM(') === 0) $subField = substr($subField, 4, -1);
$fieldParts = preg_split("/\+(?![^(]+\))/", $subField);
foreach($fieldParts as $pkey => $fieldPart)
{
$originField = trim($fieldPart);
if(stripos($originField, 'if(') === false) continue;
$fieldParts[$pkey] = $this->formatDmIfFunction($originField);
}
$fieldList[$key] = str_replace($subField, implode(' + ', $fieldParts), $field);
}
$fields = implode(',', $fieldList);
$sql = substr($sql, 0, $fieldsBegin+6) . $fields . substr($sql, $fieldsEnd);
$sql = $this->formatField($sql);
return str_replace('CREATE OR REPLACE VIEW ', 'CREATE VIEW ', $sql);
}
elseif(stripos($sql, 'CREATE UNIQUE INDEX') === 0 || stripos($sql, 'CREATE INDEX') === 0)
@@ -833,6 +812,7 @@ class dbh
if($this->dbConfig->driver == 'dm' || in_array($this->dbConfig->driver, $this->config->pgsqlDriverList))
{
$sql = str_replace('`', '"', $sql);
$sql = preg_replace('/(?<!\w)if\(/i', '"IF"(', $sql);
}
return $sql;