[英]SQL query for more information in column
我需要一些有关SQL查询的信息。 这是我的SQL表;
CustomData是我表中的列名。
CustomData具有更多列。
它表示列中的列。
如果我使用此查询;
SELECT CustomData FROM Entities
结果;
[
{
"Name": "Telefon",
"Value": "5417416039"
},
{
"Name": "Adres",
"Value": "AYDOĞAN MAH. 7.SOK. HACIHÜSEYİN APT. KAT:3 NO:6"
}
]
我想在CustomData WHERE Name = Telefon中获得价值
我怎样才能做到这一点?
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE,PUT');
$serverName = "x.x.x.x"; //serverName\instanceName
$connectionInfo = array( "Database"=>"hidden","UID"=>"sa","PWD"=>"hidden", "CharacterSet" => "UTF-8");
$consamba = sqlsrv_connect( $serverName, $connectionInfo);
$sql3 = "SELECT CustomData FROM Entities WHERE EntityTypeId='1'";
$result3 = sqlsrv_query($consamba,$sql3);
$json = array();
while($row3 = sqlsrv_fetch_array($result3,SQLSRV_FETCH_ASSOC)){
$json[] = $row3;
}
echo json_encode($json);
?>
像这样:
declare @entities table (id int, customdata nvarchar(max))
insert into @entities(id,customdata)
values (1,'
[
{
"Name": "Telefon",
"Value": "5417416039"
},
{
"Name": "Adres",
"Value": "AYDOĞAN MAH. 7.SOK. HACIHÜSEYİN APT. KAT:3 NO:6"
}
]')
select e.id, c.Value Telefon
from @entities e
cross apply openjson(e.customdata)
with(
Name nvarchar(200) '$.Name',
value nvarchar(200) '$.Value'
) c
where c.name = N'Telefon'
Select CustomData
From Entities
Where CustomData LIKE '%Telefon%'
会让你走得更远
原始答案(适用于SQL Server 2016+):
CustomData
列中的数据似乎是有效的JSON
数组,因此一种可行的方法是使用OPENJSON()
和JSON_VALUE()
解析此数据OPENJSON()
SQL Server 2016中引入了JSON
支持)。 当您将OPENJSON()
与默认架构一起使用时,结果是一个表,该表的OPENJSON()
key
, value
和type
,因此您需要包括其他CROSS APPLY
运算符以解析JSON
数组中的每个项目。
表:
CREATE TABLE Entities (
EntityTypeId varchar(1),
CustomData nvarchar(max)
)
INSERT INTO Entities
(EntityTypeId, CustomData)
VALUES ('1', N'[
{
"Name": "Telefon",
"Value": "5417416039"
},
{
"Name": "Adres",
"Value": "AYDOĞAN MAH. 7.SOK. HACIHÜSEYİN APT. KAT:3 NO:6"
}
]')
PHP:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE,PUT');
$serverName = "x.x.x.x";
$connectionInfo = array("Database"=>"hidden", "UID"=>"sa", "PWD"=>"hidden", "CharacterSet" => "UTF-8");
$consamba = sqlsrv_connect($serverName, $connectionInfo);
if ($consamba === false) {
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
$sql3 = "
SELECT
e.CustomData,
JSON_VALUE(j.[value], '$.Value') AS Telefon
FROM Entities e
CROSS APPLY OPENJSON(e.CustomData) j
WHERE
EntityTypeId = '1' AND
JSON_VALUE(j.[value], '$.Name') = N'Telefon'
";
$result3 = sqlsrv_query($consamba, $sql3);
if ($result3 === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
$json = array();
while ($row3 = sqlsrv_fetch_array($result3, SQLSRV_FETCH_ASSOC)){
$json[] = $row3["Telefon"];
}
echo json_encode($json);
sqlsrv_free_stmt($result3);
sqlsrv_close($consamba);
?>
更新:
SQL Server 2014不支持JSON
,因此一种可能的方法是使用json_decode()
解析PHP
部分中的JSON
数据:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE,PUT');
$serverName = "x.x.x.x";
$connectionInfo = array("Database"=>"hidden", "UID"=>"sa", "PWD"=>"hidden", "CharacterSet" => "UTF-8");
$consamba = sqlsrv_connect($serverName, $connectionInfo);
if ($consamba === false) {
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
$sql3 = "SELECT CustomData FROM Entities";
$result3 = sqlsrv_query($consamba, $sql3);
if ($result3 === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
$json = array();
while ($row3 = sqlsrv_fetch_array($result3, SQLSRV_FETCH_ASSOC)){
$decoded = json_decode($row3["CustomData"], true);
foreach($decoded as $item) {
if ($item["Name"] == "Telefon") {
$json[] = $item["Value"];
}
}
}
echo json_encode($json);
sqlsrv_free_stmt($result3);
sqlsrv_close($consamba);
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.