【问题标题】:SQLite query with literal values具有文字值的 SQLite 查询
【发布时间】:2018-02-25 21:20:16
【问题描述】:

我在 SQLite 中有 2 个表 A 和 B

答:

Name|Badge
----------
ABC |X
XYZ |Y

乙:

ListCode |Badges
--------------------
V        |'X','Y','Z'

我想做这样的事情:

SELECT * FROM A WHERE BADGE IN (SELECT BADGES FROM B WHERE LISTCODE = 'V');

问题是 SELECT IN 似乎不像另一个表中的文字 csv 那样工作。 我怎样才能做到这一点 ?

【问题讨论】:

    标签: php sql sqlite in-subquery


    【解决方案1】:

    这里的故事的寓意是不要像您一直在做的那样存储 CSV 数据。此答案假定您实际上存储的是 unquoted CSV 数据,即:

    X,Y,Z
    

    话虽如此,您可以使用以下查询解决此问题:

    SELECT A.*
    FROM A
    INNER JOIN B
        ON A.BADGE = B.BADGES OR
           B.BADGES LIKE A.BADGE || ',%' OR
           B.BADGES LIKE '%,' || A.BADGE || ',%' OR
           B.BADGES LIKE '%,' || A.BADGE
    WHERE
        B.BADGES IS NOT NULL
    

    这是上述查询的演示。在 MySQL 中是因为 Rextester 不支持 SQLite 但逻辑和数据是相同的。

    Demo

    【讨论】:

    • 我实际上可以选择不在那里存储引用的值。但我希望 php 客户端代码尽可能简单地调用。如果我有可能将插入更改为表 B(但它仍然必须是单行),那么最简单的方法是什么?
    • 我不知道你的 PHP 代码甚至 PHP。我认为存储 CSV 是一个坏主意,引用这些值是一个特别坏的主意。
    • @user8621037 我在查询中添加了一个演示。这至少应该让您在清理数据模型时发挥作用。
    • 谢谢!真的很感激。我可能会按照你的建议做,只是清理表结构。问题是,这是一个遗留系统,其中一些东西会影响其他地方的代码,这使得更改有点问题。
    • 您能将此答案标记为正确吗?我的答案左侧的绿色复选标记。
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 2017-05-11
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多