在laravel>5.6的json列中选择非空值的正确方法?

dohp0rv5  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(345)

我似乎不能把我的头围绕着这个。
我在一个名为 text ,我只想选择那些没有特定语言的空翻译的记录(未设置或未设置) null ).
我很难创建一个如果值设置为 null . 这里有一些 text 列json值,我需要一个只返回本例中第一条记录的查询,在这里我有一个 fr 价值:

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"
text: "{"de": "und"}"

以下是我迄今为止尝试的:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") is not null' )->get();

->退货

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"

真倒霉。它跳过了记录 fr 一点也不设置(没关系),但会继续选择记录的位置 fr 设置为 null . 因此,我需要调整查询以排除 "fr": null 让我们一步一步来处理这个问题。当我尝试对这样的字符串进行正匹配搜索时:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") = "merci"' )->get();

->退货

text: "{"de": "danke", "fr": "merci"}"

这是正确的。现在,似乎很容易找到一种方法来改变这一点,并排除带有 "fr": null . 但运气不好。

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "merci"' )->get();

->只返回 fr 已设置,但不等于 merci . 它跳过了记录 fr 未设置。

text: "{"de": "hallo", "fr": null}"

让我们尝试排除fr设置为null的记录。但也没有运气:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> "null"' )->get();

->退货

text: "{"de": "danke", "fr": "merci"}"
text: "{"de": "hallo", "fr": null}"

或者,

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> null' )->get();

->返回空结果。
我怎么能排除 fr 未设置或设置为 null ?

7z5jn7bk

7z5jn7bk1#

我在一个类似的stackoverflow线程中找到了一个解决方案。对于初学者来说,这不是一个很明显的问题。
看来 null json列中的值的计算结果不相同 null 我以前的查询尝试中的值。它需要调整如下,然后才能工作。基本上,需要首先将空值更改为相同的值 null 具有以下代码的值类型:

CAST("null" AS JSON)

然后将其放入查询中:

parent::whereRaw( 'JSON_EXTRACT(text, "$.fr") <> CAST("null" AS JSON)' )->get();

相关问题