Postgresql 查询 returns 引号之间的字符串值 " 如果它包含任何 space 字符或如果它没有 space 字符则不带引号

Postgresql query returns string values between quotation marks " if it contains any space character or without quotation if it had no space char

所以我遇到了这个奇怪的问题,我不知道是什么原因造成的。我们在 PHP 中使用 Charts.js 来绘制一些图表。我们将创建图表所需的参数存储到 PSQL table 以在需要时加载。

我的问题在于 title、group 和 label 参数,它们都是字符串数组。它们存储在文本[] table 中。问题是,当我查询图形的参数时,如果数组中的字符串有任何 space,它会在引号之间返回,否则它会作为字符串本身返回。

我有一个关联数组 $graph,它存储图形的参数并用于将值插入数据库:

$cursor = $this->query("
        INSERT INTO data.graphs(region,title,type,section,label,group,values,colors,id_sample)                   
        VALUES(
            '".$graph['local']."',
            '".$graph['title']."',
            '".$graph['type']."',
            '".$graph['section']."',
            '".$graph['label']."',
            '".$graph['group']."',
            '".$graph['values']."',
            '".$graph['colors']."',
            '".$_SESSION['id_sample']."'
        )  
    "); 

插入DB的字符串数组是这样的:

$graph1['label'] = "{Não há material presente,Material presente, mas crianças não usaram,Crianças usaram os materiais}";
$graph2['label'] = "{Boa vista, Rural, Urbana, Indigena}";
$graph3['label'] = "{Boa vista, Ru ral, Urb ana, Ind igena}";

如果我在数据库中查询我的标签,它们看起来像这样:

现在查询数据,我们为每个需要的图形的参数做一个 'SELECT *' 并再次存储它们的值关联数组(用作 Charts.js 绘图仪的参数)。

$aux = pg_fetch_array($cursor))
print_r($aux['label']);

这是我的 3 个图表中每个图表的标签:

{"Não há material presente","Material presente, mas crianças não usaram","Crianças usaram os materiais"}
{"Boa vista",Urbana,Rural,Indigena}
{"Boa vista","Urb ana","Ru ral","Ind igena"}

所以在数据库中,字符串没有引号,如果 qstring 有 space,它会在引号之间返回,这还不错,因为我希望我的字符串在引号中。

有没有办法强制数组中返回的每个字符串都在所有引号内?

我已经试过将这样的数组插入到数据库中:

$graph['label'] = "{
        \"Boa vista\",
        \"Urbana\",
        \"Rural\",
        \"Indigena\"
    }";

如果我查看数据库,字符串没有引号,它们又像上面一样返回。

这是类型 text[] 的默认 text 输出。 The manual:

The array output routine will put double quotes around element values if they are empty strings, contain curly braces, delimiter characters, double quotes, backslashes, or white space, or match the word NULL. Double quotes and backslashes embedded in element values will be backslash-escaped.
[...] for textual data types one should be prepared to cope with either the presence or absence of quotes.

如果您更喜欢所有元素都用双引号引起来的文本表示,您可以使用像这样的简单表达式:

SELECT '"' || array_to_string('{"Boa vista",Urbana,Rural,Indigena}'::text[], '", "') || '"'

如果你需要它很多,考虑一个(简单的)函数:

CREATE OR REPLACE FUNCTION f_array_to_string_with_quotes(_arr text[], _quote text = '"')
  RETURNS text LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
$func$
SELECT  || array_to_string(,  || ', ' || ) || 
$func$;

通话:

SELECT f_array_to_string_with_quotes('{"Boa vista",Urbana,Rural,Indigena}', '"');
| f_array_to_string_with_quotes              |
| :----------------------------------------- |
| "Boa vista", "Urbana", "Rural", "Indigena" |

db<>fiddle here - 更多示例

注意 结果类型现在是 text,而不是 text[]!而且它没有正确转义任何东西,因此 "simplistic".