PostgreSQL:`VIEW`不返回包含`SPLIT_PART()`列的行 问题描述:
大家好,我在查询一个视图时遇到了一些问题,该视图的列部分是og表列上的PostgreSQL:`VIEW`不返回包含`SPLIT_PART()`列的行 问题描述:,sql,postgresql,view,postgresql-13,Sql,Postgresql,View,Postgresql 13,大家好,我在查询一个视图时遇到了一些问题,该视图的列部分是og表列上的SPLIT\u part()函数的结果;我创建的视图如下所示: 创建查看客户地址列表(客户ID、姓氏、姓氏、住址地址、城市、邮政编码、省份) 选择客户端ID, 名字, 姓, 拆分部分(地址“-”,1)作为居住地址, 将部分(地址“-”,2)拆分为城市, 拆分部分(地址“-”,3)作为邮政编码, 将部分(地址“-”,4)拆分为省 来自客户; 我的意图是将结构化属性(Clients.Address定义为一个字符串VARCHAR(
SPLIT\u part()
函数的结果;我创建的视图如下所示:
创建查看客户地址列表(客户ID、姓氏、姓氏、住址地址、城市、邮政编码、省份)
选择客户端ID,
名字,
姓,
拆分部分(地址“-”,1)作为居住地址,
将部分(地址“-”,2)拆分为城市,
拆分部分(地址“-”,3)作为邮政编码,
将部分(地址“-”,4)拆分为省
来自客户;
我的意图是将结构化属性(Clients.Address
定义为一个字符串VARCHAR(255)
),它包含与客户住所相关的所有信息,并将其划分为多个列,以便分别查询(例如,从clientaddress列表中选择FirstName、LastName,其中城市为'N%';
或从clientaddress列表中选择客户端ID,其中PostalCode='82305';
)
我的经历:
Clients表包含一个测试行:
客户ID
FirstName
LastName
ResidencedAddress
城市
PostalCode
省
00451
埃齐奥
奥迪托雷
Via de Banchi 45-佛罗伦萨-50123-佛罗伦萨
佛罗伦萨
50123
佛罗伦萨
正如sticky bit所写:值周围有空格。有两种方法可以解决这个问题。一种方法是在视图中的表达式周围加上trim():
trim(SPLIT_PART(Address, '-', 2)) AS City,
另一个选项是使用适当的正则表达式拆分信息,以在拆分过程中删除空白:
select client_id,
firstname,
lastname,
address[1] as residenceaddress,
address[2] as city,
address[3] as postalcode,
address[4] as province
from (
select client_id, firstname, lastname,
regexp_split_to_array(residenceaddress, '\s*-\s*') as address
from clients
) t
从长远来看,您应该通过正确规范化数据模型并将这些值存储在单独的列中来修复数据模型。我不知道在意大利有多少城市名称包含破折号,但在德国,这种模式将很快被“Garmisch Partenkirchen”或“Leinfelden Echterdingen”等城市名称打破正如sticky bit所写:值周围有空格。有两种方法可以解决这个问题。一种方法是在视图中的表达式周围加上trim():
trim(SPLIT_PART(Address, '-', 2)) AS City,
另一个选项是使用适当的正则表达式拆分信息,以在拆分过程中删除空白:
select client_id,
firstname,
lastname,
address[1] as residenceaddress,
address[2] as city,
address[3] as postalcode,
address[4] as province
from (
select client_id, firstname, lastname,
regexp_split_to_array(residenceaddress, '\s*-\s*') as address
from clients
) t
从长远来看,您应该通过正确规范化数据模型并将这些值存储在单独的列中来修复数据模型。我不知道在意大利有多少城市名称包含破折号,但在德国,这种模式将很快被“Garmisch Partenkirchen”或“Leinfelden Echterdingen”等城市名称打破原始数据中的破折号周围有空格。结果不是
'Florence'
,而是'Florence'
。不过,为什么不规范原始表?@stickybit哦,我明白了。因此,如果我只是将字符串插入为“Via dei Banchi 45-Florence-50123-Florence”
,问题就可以解决了。But你所说的“规范化原始表”是什么意思?对不起,我是DBMS系统的新手,通过“规范化原始表”我的意思是,你不应该首先将地址存储为带破折号的字符串,而应该创建多个列并存储各个部分。像城市的列、邮政编码等,你甚至不需要那种尴尬的视图。现在我知道了。你知道,我使用视图和拆分函数只是为了让教授知道我可以使用它。那不是他解释为什么,嗯,我不认识你们的教授,但也许可以向他们展示你们知道第一范式(如果你们不知道的话,研究那个术语)给他们留下了更深刻的印象…原始数据中的破折号周围有空格。结果不是'Florence'
,而是'Florence'
。但是为什么不规范原始表?@stickybit哦,我明白了。如果我只是将字符串插入为“Via dei Banchi 45-Florence-50123-Florence”
,那么问题就来了可以解决。但是你说的“规范化原始表”是什么意思?对不起,我是DBMS系统的新手,“规范化原始表”我的意思是,你不应该首先将地址存储为带破折号的字符串,而应该创建多个列并存储各个部分。像城市的列、邮政编码等,你甚至不需要那种尴尬的视图。现在我知道了。你知道,我使用视图和拆分函数只是为了让教授知道我可以使用它。那不是他解释为什么,我不认识你的教授,但也许向他们展示你知道的第一个范式(如果你不知道的话,研究这个术语)会给他们留下更深刻的印象…我明白了,谢谢。我只是想知道trim()
函数做什么trim()
删除字符串开头和结尾的空格太棒了。我不知道。非常感谢你,这是你第二次回答我,我很高兴glad@stuckwithmrblonde:查看手册,您可以找到所有函数的说明,如TRIM():我明白了,谢谢。我只是想知道TRIM()
函数做什么TRIM()
删除字符串开头和结尾的空格太棒了。我不知道。非常感谢你,这是你第二次回答我,我很高兴glad@stuckwithmrblonde:查看手册,您可以找到所有功能的说明,如TRIM():