Sql 滤波器二维阵列

Sql 滤波器二维阵列,sql,postgresql,database-design,database-normalization,Sql,Postgresql,Database Design,Database Normalization,我有这个阵列: 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0,11:0,12:0,13:0,14:0,15:0,16:0 17:0,18:0,19:0,20:0,21:0,22:0,23:0,24:0,25:0,26:0,27:0,28:0,29:0,30:0,31:0,32:0, 49:0,33:0,34:0,35:0,36:0,37:0,38:0,39:0,40:0,41:0,42:0,43:0,44:0,45:0,46:0,47:0,

我有这个阵列:

1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0,11:0,12:0,13:0,14:0,15:0,16:0
17:0,18:0,19:0,20:0,21:0,22:0,23:0,24:0,25:0,26:0,27:0,28:0,29:0,30:0,31:0,32:0,
49:0,33:0,34:0,35:0,36:0,37:0,38:0,39:0,40:0,41:0,42:0,43:0,44:0,45:0,46:0,47:0,
48:0,50:0,51:0,52:0,53:0,54:0,55:0,56:0,57:0,58:0,59:0,60:0,61:0,62:0,63:9,64:0,
65:0,66:0,67:0,68:0,69:0,70:0,71:0,72:0,73:0,74:0,75:0,76:0,77:0,78:0,79:0,80:0,
81:0,82:0,83:0,84:0,85:0,86:0,87:0,88:0,89:0,90:0,91:0,92:0,93:0,94:0,95:0,96:0,
97:0,98:0,99:0,100:0
我想筛选所有条目,如*:0,以便只得到以下结果:

63:9
我想我必须更好地描述它:

我有一个具有字段用户技能的表用户。 在这个字段中有这样一个字符串:1:0,2:0,3:0,4:3,5:8,6:9,7:0,8:0,9:0,语法如下:skill\u id:prio,skill\u id:prio,skill\u id:prio,skill\u id:prio,skill\u id:prio

现在我想将users表与skills表连接起来,如下所示:

SELECT skill_name
FROM users
inner join skills on skills.skill_id = ANY (string_to_array(regexp_replace(user_skill,':[0-9]*','','g'),',')::int[])
where user_id = 16
order by skill_name
这很好,但我只想看到用户拥有prio 0的技能名称。

正确的解决方案 您可能希望熟悉并将其实现为表用户和技能之间的正确n:m关系,并在user\u skill表中添加一个属性prio。以下是完整的配方:

然后,您的查询可以非常简单:

SELECT s.skill_name
FROM   user_skill uk
JOIN   skills s USING (skill_id)
WHERE  uk.user_id = 16
AND    uk.prio <> 0
ORDER  BY s.skill_name;
它可以而且应该用指数进行备份,并且比现在的速度快几个数量级。 它需要更多的磁盘空间

黑暗面的解决方案 在这种不幸的情况下,您可以自行查询。然而,这假设至少是Postgres版本

SELECT s.skill_name
FROM  (
   SELECT split_part(us_item, ':', 1) AS skill_id
   FROM  (
      SELECT trim(unnest(string_to_array(user_skill, ','))) AS us_item
      FROM   users
      WHERE  user_id = 16      -- enter user_id here
      ) x
   WHERE  split_part(us_item, ':', 2) <> '0'
   ) u
JOIN   skills s USING (skill_id)
ORDER  BY 1;
示例演示:

SELECT split_part(us_item, ':', 1) AS skill_id
FROM  (
   SELECT  trim(unnest(string_to_array(
'1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0,11:0,12:0,13:0,14:0,15:0,16:0,'
'17:0,18:0,19:0,20:0,21:0,22:0,23:0,24:0,25:0,26:0,27:0,28:0,29:0,30:0,31:0,32:0,'
'49:0,33:0,34:0,35:0,36:0,37:0,38:0,39:0,40:0,41:0,42:0,43:0,44:0,45:0,46:0,47:0,'
'48:0,50:0,51:0,52:0,53:0,54:0,55:0,56:0,57:0,58:0,59:0,60:0,61:0,62:0,63:9,64:0,'
'65:0,66:0,67:0,68:0,69:0,70:0,71:0,72:0,73:0,74:0,75:0,76:0,77:0,78:0,79:0,80:0,'
'81:0,82:0,83:0,84:0,85:0,86:0,87:0,88:0,89:0,90:0,91:0,92:0,93:0,94:0,95:0,96:0,'
'97:0,98:0,99:0,100:0', ','))) AS item
   ) x
WHERE  split_part(us_item, ':', 2) <> '0';
trim处理前导空格和尾随空格,如示例中所示。但这些可能只是草率问题中的人工制品

我修复了一个丢失的,。
顺便说一句,SQL标准允许像我演示的那样输入字符串文字。奇怪,但有时很有用。

在数组上循环并拾取感兴趣的元素如何?首先称之为数组,然后称之为字符串。示例使用字符串。。。选择版本中的表定义和PostgreSQL版本会有所帮助。示例数据中缺少,字符串中是否真的有空格?PostgreSQL内部有一个数组映射函数。它在每个非空数组元素上执行函数和参数。我看不到通过SQL调用来公开它的方法。@TimChild:。还有一个hstore contrib模块,基本上是键/值存储。我理解,但我无法创建技能表,我只有阅读权限:有趣。。。当我读到他的问题时,我总是假设他的数组是这样存储的,并且他在指示下标@马文:除了查询之外,您是否真的将技能及其级别存储在需要解析的文本字段中-|