mysql语句,用逗号分隔列表并在中选择

6bc51xsx  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(290)

有没有可能做出这样的交叉陈述:

SELECT name FROM branchen WHERE id IN (SELECT value FROM metadata WHERE user_id=XX AND metakey = 'branche')

Result is:
Branche A

这个结果只返回“branchen”的第一个值。结果如下:

SELECT name FROM branchen WHERE id IN (1,2,3,4)

Result is:
Branche A
Branche B
Branche C

似乎我必须将select语句转换为字符串值?

SELECT value FROM metadata WHERE user_id=XX AND metakey = 'branche'
Result is: 
1,2,3

是的,如果该值在表中保存为自己的值会更好。我现在不会改变结构,也许有人能帮我?
谢谢!

bprjcwpo

bprjcwpo1#

问题是 value 是字符串,不是数字。因为 IN 比较就是一个数字,它被转换成一个数字。
真正的解决方法是修复数据模型,这样就不会将数字存储在字符串中。但是假设你被一个非常糟糕的数据模型困住了,你可以使用 find_in_set() 取而代之的是:

SELECT b.name
FROM branchen b
WHERE EXISTS (SELECT 1
              FROM metadata md
              WHERE md.metakey = 'branche' AND
                    find_in_set(b.id, md.value) 
             );
pgx2nnw8

pgx2nnw82#

你可以用 string_split 功能

declare @ids varchar (100);

SELECT @ids = value FROM metadata WHERE user_id=XX AND metakey = 'branche'

SELECT name FROM branchen WHERE id IN (select value from string_split(@ids, ','));

如果您使用mysql,那么您可以使用find\ in\ u set。 string_split -此方法在给定分隔符上拆分字符串。

相关问题