我是SQL的新手,我一直在努力获得想要的结果。
我有这些表:
我的目标是产生这个:
出于翻译目的:emprunt ==借用,livre ==书籍,全部==收藏
所以我的目标是获取所有书籍的id(id_livre),它们的藏书名(titre)和一个布尔值:
如果是借用则为TRUE(emprunt表中的id_livre)
否则为
我已经做到了:
SELECT livre.id_livre, titre, id_emprunt
FROM livre NATURAL JOIN oeuvre LEFT JOIN emprunt ON livre.id_livre = emprunt.id_livre
ORDER BY id_livre;
并获得以下输出:
所以我接近我想要的,但是我不知道如何在第三列中进行返回布尔值而不是id_emprunt的测试
任何帮助表示感谢,谢谢。
答案 0 :(得分:0)
您的代码与您所说的非常接近。您可以在第三列上使用CASE
语句,根据t
的值将输出更改为f
或id_emprunt
:
SELECT livre.id_livre,
titre,
CASE
WHEN id_emprunt IS NULL THEN 'f'
ELSE 't'
END AS est_emprunte
FROM livre NATURAL JOIN oeuvre LEFT JOIN emprunt ON livre.id_livre = emprunt.id_livre
ORDER BY id_livre;
答案 1 :(得分:0)
只需使用#Get input
[System.String]$SearchPath = Read-Host -Prompt 'Enter path'
[System.String]$SearchPattern = Read-Host -Prompt 'Enter search pattern'
[System.String]$SearchRecurse = Read-Host -Prompt 'Search recurse (Y/N)'
#Validate input
if ((-not $SearchPath) -or (-not (Test-Path -Path $SearchPath)))
{
throw ('Path "' + $SearchPath + 'is not available!')
}
if ((-not $SearchPattern))
{
throw ('Search pattern is empty!')
}
if (('Y', 'N') -notcontains $SearchRecurse)
{
throw ('Search recurse parameter "' + $SearchRecurse + ' is not valid!')
}
#Get all files
Out-Host -InputObject 'Get all files...'
[PSCustomObject[]]$Files = @()
if ($SearchRecurse -eq 'Y')
{
$Files = Get-ChildItem -Path $SearchPath -File -Recurse -Force #Collect also files from subfolders
}
else
{
$Files = Get-ChildItem -Path $SearchPath -File -Force #Collect only files from the current folder
}
#Search for string
Out-Host -InputObject 'Search for string...'
[PSCustomObject[]]$Output = @()
foreach ($File in ($Files)) #Process each file
{
Out-Host -InputObject $File.FullName
$Output += Select-String -Path $File.FullName -Pattern $SearchPattern | Select-Object -Property LineNumber, Filename, Path, Pattern, Line
}
$Output | Format-Table -Wrap
表达式:
case
Oracle没有内置的布尔类型,因此您可以使用字母SELECT l.id_livre, l.titre,
(CASE WHEN e.id_emprunt IS NOT NULL THEN 't' ELSE 'f' END) as est_emprunte
FROM livre l JOIN
oeuvre o
USING (id_livre) LEFT JOIN
emprunt e
USING (id_livre)
ORDER BY id_livre;
和't'
。如果这样做(某些数据库可以这样做),您将使用:
'f'
请注意,我替换了 (e.id_emprunt IS NOT NULL) as est_emprunte
。我用“憎恶”一词来形容(部分与“自然”一词不适当)。我强烈反对使用它的原因是因为它没有考虑正确声明的外键关系。这也是很危险的,因为用于联接的列在查询中不明确,因此出于这个原因,我认为这也是一种不好的做法。
答案 2 :(得分:0)
您只需要使用CASE。所以:
SELECT livre.id_livre
, titre
, CASE WHEN id_emprunt IS NULL THEN 'f'
ELSE 't' END AS est_emprunte
FROM livre
LEFT JOIN oeuvre
USING(id_oeuvre)
LEFT JOIN emprunt
USING(id_livre)
ORDER BY id_livre