0

问题描述:

大家好,我在查询 VIEW 时遇到了一些麻烦,其列部分是SPLIT_PART()og 表列上的函数结果;我按如下方式创建了 VIEW:

CREATE VIEW ClientsAddressList(Client_ID, FirstName, LastName, ResidenceAddress, City, PostalCode, Province) AS
SELECT Client_ID, 
       FirstName, 
       LastName, 
       SPLIT_PART(Address, '-', 1) AS ResidenceAddress, 
       SPLIT_PART(Address, '-', 2) AS City, 
       SPLIT_PART(Address, '-', 3) AS PostalCode,     
       SPLIT_PART(Address, '-', 4) AS Province
FROM Clients;

我的意图是将包含与客户住所相关的所有信息的结构化属性(Clients.Address定义为字符串)分成几列以单独查询(例如或)。VARCHAR(255)SELECT FirstName, LastName FROM ClientAddressList WHERE City LIKE 'N%';SELECT Client_ID FROM ClientAddressList WHERE PostalCode = '82305';

我的经历:

Clients 表包含一个测试行:

Client_ID 居住地址 城市 邮政编码
00451 埃齐奥 奥迪托雷 Via dei Banchi 45 - 佛罗伦萨 - 50123 - 佛罗伦萨 佛罗伦萨 50123 佛罗伦萨

所以我VIEW有这一行:

Client_ID 居住地址 城市 邮政编码
00451 埃齐奥 奥迪托雷 Via dei Banchi 45 佛罗伦萨 50123 佛罗伦萨

我试过了:

SELECT Client_ID, FirstName, LastName
FROM ClientsAddressList
WHERE City = 'Florence'

它不返回任何结果:

Client_ID 居住地址 城市 邮政编码

但是,如果我查询不是SPLIT_PART()它的结果的列:

SELECT Client_ID, FirstName, LastName, City
FROM ClientsAddressList
WHERE Client_ID = '00451'
Client_ID 城市
00451 埃齐奥 奥迪托雷 佛罗伦萨

我的期望:

即使在结果列上,我也会WHERE从句工作并返回值:SPLIT_PART()

SELECT Client_ID
FROM ClientAddressList
WHERE PostalCode LIKE = '%123'
Client_ID
00451

有人可以解释一下可能是什么问题吗?太感谢了!

4

1 回答 1

2

正如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”等城市名称打破

于 2021-02-08T11:14:48.393 回答